【问题标题】:Calling Java REST API (on Tomcat) from Node JS in HTTPS在 HTTPS 中从 Node JS 调用 Java REST API(在 Tomcat 上)
【发布时间】:2015-11-26 15:39:47
【问题描述】:

我正在涉足 Node JS。我有一个要求,Node JS(使用“请求”模块)必须通过 HTTPS 调用 Java REST API。

如给定URL 中所述,我创建了一个 CA 文件(ca.key、c​​a.pem)、服务器证书(server1.key、server1.pem)和客户端(client1.key、c​​lient1.pem)和我能够在两个 Node JS 应用程序(服务器和客户端)之间进行通信。

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

【问题讨论】:

    标签: java node.js tomcat ssl https


    【解决方案1】:

    以下是我使用自签名证书通过 HTTPS 通过 HTTPS 与 Tomcat 通信所遵循的方法。我在网上看到很多解决方案喜欢制作process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0"; 或者 rejectUnauthorized/strictSSL as false 但我认为这些可能不是正确测试的有效解决方案。

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

    NodeJS 到 Tomcat:

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

    1. 创建 CA 证书,自签名

      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文件夹中找到)。 (这是在证书中将主机名/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. 创建服务器密钥、csr 并使用我们的 CA 签名

      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. 通过'agent'属性在NodeJS的'request'调用中传递'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 Keystore 文件(使用 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 步:配置 Tomcat 服务器

    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"/>

    【讨论】:

    • 非常有帮助,谢谢。这个答案基本上 99% 是如何创建证书以及如何将它们放入 Java 密钥库中。这非常有助于为我指明正确的方向。从节点的角度来看,重要的一点是我可以确认的第 5 步。
    猜你喜欢
    • 2019-04-20
    • 1970-01-01
    • 1970-01-01
    • 2019-12-27
    • 1970-01-01
    • 2017-12-02
    • 2021-05-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多