WSO2 APIM 4.1.0中Postman调用Mutual SSL API失败求助
WSO2 APIM 4.1.0 双向SSL调用失败问题排查与解决
环境与配置背景
- WSO2 APIM 4.1.0 GA版本
- 操作系统:Windows 11
- 通过Java Keytool生成自签名证书配置双向SSL,证书生成步骤如下:
- 创建新密钥库:
keytool -genkey -keyalg RSA -alias dev.wso2.com -keystore "C:\pathtoAPIM\wso2am-4.1.0\repository\resources\security\devwso2.jks" -validity 4000 - 转换为PKCS12格式:
keytool -importkeystore -srckeystore C:\pathtoAPIM\wso2am-4.1.0\repository\resources\security\devwso2.jks -destkeystore C:\pathtoAPIM\wso2am-4.1.0\repository\resources\security\devwso2.jks -deststoretype pkcs12 - 导出公钥:
keytool -exportcert -alias dev.wso2.com -rfc -file "C:\pathtoAPIM\wso2am-4.1.0\repository\resources\security\devwso2.pem" -keystore "C:\pathtoAPIM\wso2am-4.1.0\repository\resources\security\devwso2.jks" - 将公钥导入信任库:
keytool -import -alias dev.wso2.com -file "C:\pathtoAPIM\wso2am-4.1.0\repository\resources\security\devwso2.pem" -keystore "C:\pathtoAPIM\wso2am-4.1.0\repository\resources\security\client-truststore.jks"
- 创建新密钥库:
证书已成功导入信任库并通过管理控制台验证,后续完成以下配置:
- 在发布者门户创建API,启用强制双向SSL
- 应用级安全设置中上传客户端证书,将OAuth设为可选
- API已发布至开发者门户
调用错误详情
Postman调用错误
在Postman证书标签配置:
- Host: dev.wso2.com
- CRT文件: dev.wso2.crt
- KEY文件: devwso2.pem
- Passphrase: keystorepwd
关闭通用标签的SSL证书验证后调用,收到错误:
Error: error:0900006e:PEM routines:OPENSSL_internal:NO_START_LINE
Curl调用错误
执行命令:
curl -vk GET "https://dev.wso2.com:8243/mutualsslapi/1.0.0" -H "accept: applicaition/json" --cert "C:\Development_Avecto\Learning\File\dev.wso2.crt" --key "C:\Development_Avecto\Learning\File\devwso2.pem"
返回错误:
- Could not resolve host: GET
- Closing connection 0
curl: (6) Could not resolve host: GET- Trying 127.0.0.1:8243...
- Connected to dev.wso2.com (127.0.0.1) port 8243 (#1)
- schannel: disabled automatic use of client certificate
- schannel: Failed to import cert file C:\Development_Avecto\Learning\File\dev.wso2.crt, last error is 0x80092002
- Closing connection 1
curl: (58) schannel: Failed to import cert file C:\Development_Avecto\Learning\File\dev.wso2.crt, last error is 0x80092002
问题原因分析
Postman错误原因:
NO_START_LINE错误表明OpenSSL无法识别私钥文件格式,你导出的devwso2.pem是公钥而非私钥,Postman需要包含私钥的PEM文件,而非公钥。dev.wso2.crt若为JKS导出的公钥证书,格式可能不符合Postman要求,需确保是完整的PEM格式证书。
Curl错误原因:
- 第一个错误
Could not resolve host: GET是因为命令中-vk和GET之间多了空格,导致curl把GET当作主机名解析。 - 第二个错误
schannel: Failed to import cert file是因为Windows下curl默认使用schannel作为SSL后端,schannel不支持单独的PEM格式证书和私钥,需使用PFX(PKCS12)格式的证书文件。
- 第一个错误
解决方法
1. 导出正确的私钥和证书文件
从PKCS12格式的JKS中导出包含私钥的PEM文件和完整证书(需安装OpenSSL工具):
- 导出私钥:
openssl pkcs12 -in "C:\pathtoAPIM\wso2am-4.1.0\repository\resources\security\devwso2.jks" -nocerts -out devwso2-key.pem -nodes - 导出证书:
openssl pkcs12 -in "C:\pathtoAPIM\wso2am-4.1.0\repository\resources\security\devwso2.jks" -nokeys -out devwso2-cert.pem - (可选)将证书和私钥合并成PFX文件(适配curl的schannel后端):
openssl pkcs12 -export -in devwso2-cert.pem -inkey devwso2-key.pem -out devwso2.pfx
2. Postman调用修正
- 在Postman证书标签中,将KEY文件替换为刚导出的
devwso2-key.pem,CRT文件替换为devwso2-cert.pem。 - 确认Passphrase为密钥库密码,保存配置后重新调用API。
3. Curl调用修正
方法一:使用PFX文件(推荐)
修正命令语法并使用PFX文件:
curl -vk GET "https://dev.wso2.com:8243/mutualsslapi/1.0.0" -H "accept: application/json" --cert-type P12 --cert "C:\path\to\devwso2.pfx:keystorepwd"
注:修正原命令中applicaiton/json的拼写错误为application/json。
方法二:强制curl使用OpenSSL后端
若安装了带OpenSSL的curl,设置环境变量强制使用OpenSSL后调用:
set SSL_CERT_FILE=C:\path\to\ca-bundle.crt curl -vk --ssl-no-revoke GET "https://dev.wso2.com:8243/mutualsslapi/1.0.0" -H "accept: application/json" --cert "C:\path\to\devwso2-cert.pem" --key "C:\path\to\devwso2-key.pem"
内容的提问来源于stack exchange,提问作者Justin
相关产品推荐
相关产品推荐

