如何在Karate+Python自动化脚本中为API调用添加cert.pem和key.pem作为请求头?
Karate + Python 自动化实现SSL证书生成与API调用配置
一、用Python自动生成公私钥对
可以用Python的cryptography库生成自签名证书和私钥,全程自动化无需手动下载文件。
- 先安装依赖:
pip install cryptography
- 生成证书和私钥的代码示例:
from cryptography import x509 from cryptography.x509.oid import NameOID from cryptography.hazmat.primitives import serialization, hashes from cryptography.hazmat.primitives.asymmetric import rsa from cryptography.hazmat.backends import default_backend import datetime # 生成RSA私钥 private_key = rsa.generate_private_key( public_exponent=65537, key_size=2048, backend=default_backend() ) # 配置自签名证书的主体信息 subject = issuer = x509.Name([ x509.NameAttribute(NameOID.COUNTRY_NAME, "CN"), x509.NameAttribute(NameOID.STATE_OR_PROVINCE_NAME, "Beijing"), x509.NameAttribute(NameOID.LOCALITY_NAME, "Beijing"), x509.NameAttribute(NameOID.ORGANIZATION_NAME, "TestOrg"), x509.NameAttribute(NameOID.COMMON_NAME, "test-api.com"), ]) # 创建自签名证书 cert = x509.CertificateBuilder().subject_name( subject ).issuer_name( issuer ).public_key( private_key.public_key() ).serial_number( x509.random_serial_number() ).not_valid_before( datetime.datetime.utcnow() ).not_valid_after( datetime.datetime.utcnow() + datetime.timedelta(days=365) ).add_extension( x509.SubjectAlternativeName([x509.DNSName("test-api.com")]), critical=False, ).sign(private_key, hashes.SHA256(), default_backend()) # 保存私钥到key.pem with open("key.pem", "wb") as f: f.write(private_key.private_bytes( encoding=serialization.Encoding.PEM, format=serialization.PrivateFormat.TraditionalOpenSSL, encryption_algorithm=serialization.NoEncryption() )) # 保存证书到cert.pem with open("cert.pem", "wb") as f: f.write(cert.public_bytes(serialization.Encoding.PEM))
运行这段代码后,会在当前目录自动生成cert.pem和key.pem文件。
二、在Karate测试中使用生成的证书
Karate原生支持SSL客户端证书认证,直接在测试脚本中指定证书路径即可完成配置。
方式1:全局配置(所有请求生效)
在karate-config.js中添加SSL配置:
function fn() { var config = { apiUrl: 'https://your-target-api.com' }; // 绑定生成的证书和私钥 karate.configure('ssl', { cert: 'cert.pem', key: 'key.pem' }); return config; }
之后所有API请求都会自动使用这两个文件进行SSL认证。
方式2:单个请求配置
如果仅需特定请求使用证书,可在请求中单独设置:
Given url apiUrl + '/target-endpoint' And ssl cert 'cert.pem' key 'key.pem' When method get Then status 200
方式3:Python驱动Karate联动
如果用Python调用Karate测试(比如通过subprocess),可以先执行证书生成逻辑,再启动Karate脚本,确保Karate能读取到生成的文件:
import subprocess # 先执行证书生成逻辑(可封装成函数) def generate_cert_and_key(): # 这里放入前面的证书生成代码 pass generate_cert_and_key() # 调用Karate测试文件 subprocess.run(['karate', 'your-test.feature'])
注意事项
- 生成的证书需匹配目标API的域名要求,否则会触发SSL验证错误
- 如果目标API使用CA签发的证书,需额外配置信任CA证书:
karate.configure('ssl', { trustStore: 'ca-cert.pem' })
内容的提问来源于stack exchange,提问作者ram
相关产品推荐
相关产品推荐

