You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用NodeJS的soap模块调用需JKS证书的Web服务?

解决Node.js soap模块调用JKS证书Web服务的证书验证问题

你遇到的UNABLE_TO_VERIFY_LEAF_SIGNATURE错误主要有两个原因:一是Node.js默认的CA信任库不包含服务端证书的签发机构,二是Node.js本身不直接支持JKS格式的证书文件——我们需要先把JKS转成Node.js能识别的PEM格式,再配置SOAP客户端的SSL参数来完成认证。

第一步:将JKS证书转换为PEM格式

JKS是Java专属的密钥库格式,Node.js使用PEM格式的证书和私钥,所以需要通过keytool和openssl工具完成转换:

  1. 将JKS导出为PKCS12格式(这是通用的密钥库格式,openssl可以处理):

    keytool -importkeystore -srckeystore your-keystore.jks -destkeystore keystore.p12 -srcstoretype JKS -deststoretype PKCS12 -srcstorepass YOUR_JKS_PASSWORD -deststorepass YOUR_P12_PASSWORD
    

    替换your-keystore.jks为你的JKS文件路径,YOUR_JKS_PASSWORD是JKS的密码,YOUR_P12_PASSWORD可以设为和JKS相同的密码,方便记忆。

  2. 从PKCS12导出客户端证书(PEM格式):

    openssl pkcs12 -in keystore.p12 -out client-cert.pem -clcerts -nokeys -passin pass:YOUR_P12_PASSWORD
    
  3. 从PKCS12导出客户端私钥(PEM格式):

    openssl pkcs12 -in keystore.p12 -out client-key.pem -nocerts -nodes -passin pass:YOUR_P12_PASSWORD
    

    -nodes参数会让私钥不加密,如果你需要加密私钥,可以去掉这个参数。

  4. (可选)导出JKS中的CA证书:
    如果服务端的证书是由JKS里的CA签发的,需要导出CA证书来让Node.js信任服务端:

    keytool -exportcert -alias YOUR_CA_ALIAS -keystore your-keystore.jks -file ca-cert.pem -storepass YOUR_JKS_PASSWORD
    

    替换YOUR_CA_ALIAS为JKS中CA证书的别名。

第二步:配置SOAP客户端的SSL选项

修改你的代码,添加SSL配置选项,让soap客户端使用转换后的PEM证书:

var soap = require('soap');
var fs = require('fs');
var url = 'https://HOST:PORT/SERVICE?wsdl';

// 读取转换后的PEM文件
const clientCert = fs.readFileSync('./client-cert.pem');
const clientKey = fs.readFileSync('./client-key.pem');
const caCert = fs.readFileSync('./ca-cert.pem'); // 如果你导出了CA证书,就加上这个

const soapOptions = {
  wsdl_options: {
    rejectUnauthorized: true, // 生产环境必须设为true,禁止跳过证书验证
    cert: clientCert,
    key: clientKey,
    ca: [caCert] // 告诉Node.js信任这个CA签发的证书,解决"unable to verify the first certificate"错误
  }
};

soap.createClient(url, soapOptions, function (err, client) {
  if (err) {
    console.error('创建SOAP客户端失败:', err);
    return;
  }

  client.Operation(args, function (err, result) {
    if (err) {
      console.error('调用接口失败:', err);
      return;
    }
    console.log('调用结果:', result);
  });
});

常见问题排查

  • 如果你不确定JKS里的别名,可以用这个命令查看:
    keytool -list -v -keystore your-keystore.jks -storepass YOUR_JKS_PASSWORD
    
  • 如果还是报证书验证错误,先临时把rejectUnauthorized设为false测试——如果能成功调用,说明是CA信任的问题,检查CA证书是否正确导出并配置;
  • 确保客户端证书和私钥匹配,转换过程中密码不要输错;
  • 生产环境绝对不要把rejectUnauthorized设为false,这会让你的请求暴露在中间人攻击的风险中。

内容的提问来源于stack exchange,提问作者EdwinCab

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 06:51:51