在HTTPS中从节点JS调用Java REST API(在Tomcat上)

我是一个涉足Node的JS。 我得到了一个要求,其中Node JS(使用'request'模块)必须通过HTTPS调用Java REST API。

正如在给定的URL中所解释的那样,我创build了一个CA文件(ca.key,ca.pem),certificate了server(server1.key,server1.pem)和client(client1.key,client1.pem),并且能够通信在两个节点JS应用程序(服务器和客户端)之间。

现在我想从我的Node JS客户端访问运行在Apache Tomcat上的JAVA REST API。 那么现在怎样才能将我的Node JS服务器密钥(server1.key,server1.pem)&ca.pem导入Tomcat Keystore? 我可以直接将这些server1.key,server1.pem&ca.pem包含到Tomcat中,还是必须将它们转换为.p12或.jks并导入它们?

下面是我遵循NodeJS通过HTTPS与自签名证书进行Tomcat通信的方法。 我看到许多在线解决scheme,使process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0";rejectUnauthorized/strictSSL as false但我认为这些可能不是正确的testing的有效解决scheme。

这也将消除像DEPTH_ZERO_SELF_SIGNED_CERT这样的错误

NodeJS到Tomcat:

步骤1:证书和密钥库生成(步骤1到4使用openssl)

  1. 创buildCA证书,自签名

    openssl genrsa -des3 -out ca.key 2048 openssl req -new -x509 -days 365 -key ca.key -out ca.crt //Provide a valid password during certificate generation

  2. 修改openssl文件夹下的openssl.cfg/openssl.cnf文件(一般可以在openssl / bin文件夹中find)。 (这是将证书中的主机名/ IP地址添加到'subjectAltName'

    a)确保“v3_req”被赋值并取消注释

    req_extensions = v3_req

    b)然后在“v3_req”下追加主机名如下:

    subjectAltName = @alt_names [alt_names] DNS.1 = <hostname of Tomcat server> IP.1 = <IP address of Tomcat server>

  3. 使用我们的CA创build服务器密钥,csr和签名

    openssl genrsa -out server.key 1024 openssl req -new -key server.key -out server.csr -config openssl.cfg (Give tomcat server '<hostname>' for field 'Common Name' ) openssl x509 -req -in server.csr -out server.crt -CA ca.crt -CAkey ca.key -CAcreateserial -days 365 -extensions v3_req -extfile openssl.cfg openssl x509 -in server.crt -text –noout (optional command to validate created certificate)

  4. 将服务器的证书文件和私钥转换为PKCS#12

    openssl pkcs12 -export -out certificate.p12 -inkey server.key -in server.crt -certfile ca.crt //Provide a valid password during .p12 generation

  5. 在NodeJS的'request'调用中通过'agent'属性传递'ca.crt':

    var ca = fs.readFileSync("certs/30112015/ca.crt"); var agent = new https.Agent({ ca: ca }); var opts = { agent: agent }; request(opts, function(err, response, body) { //response handler code } );

  6. 将PKCS#12转换为Java密钥库文件(使用java'keytool')

    keytool -importkeystore -srckeystore certificate.p12 -srcstoretype pkcs12 -destkeystore keystore.jks -deststoretype jks

  7. 将CA证书导入密钥库

    keytool -import -alias root -keystore keystore.jks -trustcacerts -file ca.crt

第2步:configurationTomcat服务器

  1. 将keystore.jks文件复制到apache-tomcat-8.0.21 / conf目录
  2. 在server.xml中添加以下连接器

    <Connector URIEncoding="UTF-8" connectionTimeout="20000" port="2020" protocol="HTTP/1.1" redirectPort="8099"/> <Connector SSLEnabled="true" clientAuth="false" keystoreFile="C:/apache-tomcat-8.0.21/conf/keystore.jks" keystorePass="password" maxThreads="1000" port="8099" protocol="org.apache.coyote.http11.Http11NioProtocol" scheme="https" secure="true" sslProtocol="TLS"/>