WSO2 EI 6.X.X(Docker)双向SSL认证配置疑问及完整步骤咨询
关于JKS格式警告的说明
- 可以忽略该警告,但不推荐。JKS是Oracle专属格式,PKCS12是跨平台兼容的行业标准,长期来看建议按提示迁移。
- 迁移命令(替换为你的实际路径):
keytool -importkeystore -srckeystore C:\ei_pathserver\repository\resources\security\eitest.jks -destkeystore C:\ei_pathserver\repository\resources\security\eitest.jks -deststoretype pkcs12
完整双向SSL配置步骤
前提准备
已完成:
- 生成WSO2 EI的密钥库(eitest.jks)及公钥证书
- 客户端应用已生成自身的密钥库、公钥证书;若EI需调用客户端服务,需获取客户端服务的公钥证书
一、入站双向SSL配置(Client APP → WSO2 EI)
此配置确保只有携带有效证书的客户端能访问EI的API/服务。
导入客户端公钥到EI信任库
将客户端的公钥证书导入EI的默认信任库(client-truststore.jks):keytool -import -alias client-cert -file C:\path_to_client_cert\client_public_cert.cer -keystore C:\path_eiserver\repository\resources\security\client-truststore.jks修改EI的axis2.xml配置
打开C:\path_eiserver\repository\conf\axis2\axis2.xml,找到HTTPS传输接收器节点(<transportReceiver name="https" class="org.apache.synapse.transport.passthru.PassThroughHttpSSLListener">),修改如下参数:- 强制客户端提供证书:
<parameter name="SSLVerifyClient">require</parameter>- 配置EI的SSL密钥库(若已迁移为PKCS12,
Type改为PKCS12):
<parameter name="keystore" locked="false"> <KeyStore> <Location>repository/resources/security/eitest.jks</Location> <Type>JKS</Type> <Password>你的密钥库密码</Password> <KeyPassword>你的密钥密码</KeyPassword> </KeyStore> </parameter>- 配置信任库:
<parameter name="truststore" locked="false"> <TrustStore> <Location>repository/resources/security/client-truststore.jks</Location> <Type>JKS</Type> <Password>你的信任库密码</Password> </TrustStore> </parameter>重启WSO2 EI服务
配置修改后必须重启服务,使设置生效。
二、出站双向SSL配置(WSO2 EI → Client APP)
此配置确保EI调用客户端服务时,能通过对方的证书验证,同时提供自身证书供对方验证。
导入客户端服务公钥到EI信任库
若客户端服务要求验证EI的请求,需将客户端服务的公钥证书导入EI的client-truststore.jks:keytool -import -alias client-service-cert -file C:\path_to_client_service_cert\client_service_public_cert.cer -keystore C:\path_eiserver\repository\resources\security\client-truststore.jks配置EI的HTTPS发送器
在axis2.xml中找到HTTPS传输发送器节点(<transportSender name="https" class="org.apache.synapse.transport.passthru.PassThroughHttpSSLSender">),确认密钥库和信任库配置正确:
<parameter name="keystore" locked="false"> <KeyStore> <Location>repository/resources/security/eitest.jks</Location> <Type>JKS</Type> <!-- PKCS12格式则改为PKCS12 --> <Password>你的密钥库密码</Password> <KeyPassword>你的密钥密码</KeyPassword> </KeyStore> </parameter> <parameter name="truststore" locked="false"> <TrustStore> <Location>repository/resources/security/client-truststore.jks</Location> <Type>JKS</Type> <Password>你的信任库密码</Password> </TrustStore> </parameter>
- API/代理服务中启用出站SSL
在调用客户端服务的API端点配置中,添加SSL策略(或直接使用全局配置):
<endpoint name="ClientServiceEndpoint"> <address uri="https://client-app-domain:port/service-path" format="json"> <enableSec policy="conf:/repository/axis2/policies/ssl_policy.xml"/> </address> </endpoint>
三、为REST API配置双向认证
确保入站SSL配置完成
完成前面的入站双向SSL配置步骤。修改API配置添加安全处理器
打开API的XML文件(路径:repository/deployment/server/synapse-configs/default/api/),添加SSLMutualAuthHandler处理器,强制验证客户端证书:
<handlers> <handler class="org.wso2.carbon.apimgt.gateway.handlers.security.SSLMutualAuthHandler"> <property name="SSLVerifyClient" value="require"/> </handler> </handlers>
- 测试API
使用携带客户端证书的工具(如curl)发送请求:curl -X GET https://ei-host:port/your-api-context/path -E client-cert.pem --key client-key.pem -k
验证只有携带有效证书的请求能成功访问API。
注意事项
- 生产环境禁止使用自签名证书,需使用CA签发的正规证书。
- 密钥库、信任库的密码需严格保密,避免泄露。
- 迁移为PKCS12格式后,需同步修改所有配置文件中的
Type参数为PKCS12。
内容的提问来源于stack exchange,提问作者Justin

