在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)
-
创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
-
修改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>
-
使用我们的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) -
将服务器的证书文件和私钥转换为PKCS#12
openssl pkcs12 -export -out certificate.p12 -inkey server.key -in server.crt -certfile ca.crt //Provide a valid password during .p12 generation
-
在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 } );
-
将PKCS#12转换为Java密钥库文件(使用java'keytool')
keytool -importkeystore -srckeystore certificate.p12 -srcstoretype pkcs12 -destkeystore keystore.jks -deststoretype jks
-
将CA证书导入密钥库
keytool -import -alias root -keystore keystore.jks -trustcacerts -file ca.crt
第2步:configurationTomcat服务器
- 将keystore.jks文件复制到apache-tomcat-8.0.21 / conf目录
-
在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"/>