使用椭圆曲线密钥的Node.js HTTPS请求
问题描述:
我想构建一个HTTPS客户端,该客户端连接到需要相互验证的HTTPS服务器。此外,客户端密钥是椭圆曲线密钥而不是RSA密钥。为了支持椭圆曲线键,我用OpenSSL 1.0.2a重新编译了Node.js。使用椭圆曲线密钥的Node.js HTTPS请求
在我的node.js程序,我设置的选项来指定密钥和证书,
var options = {
// These are necessary only if using the client certificate authentication
key: fs.readFileSync('client-key.pem'),
cert: fs.readFileSync('client-cert.pem'),
,当我运行它,我得到这个错误:
Error: error:0906D06C:PEM routines:PEM_read_bio:no start line
at Error (native)
at Object.createSecureContext (_tls_common.js:110:19)
at Object.exports.connect (_tls_wrap.js:854:21)
at Agent.createConnection (https.js:84:14)
at Agent.createSocket (_http_agent.js:196:16)
at Agent.addRequest (_http_agent.js:168:23)
at new ClientRequest (_http_client.js:156:16)
at Object.exports.request (http.js:51:10)
at exports.request (https.js:138:15)
...
这表明Node.js无法读取EC密钥。 此错误消息是类似于在openssl尝试读取密钥作为X509证书到:
openssl x509 -text -in sample.key
unable to load certificate
140735234208608:error:0906D06C:PEM routines:PEM_read_bio:no start
line:pem_lib.c:701:Expecting: TRUSTED CERTIFICATE
我怎么能强迫的Node.js加载此键为EC键?
答
一旦openssl 1.0.2a配置正确,EC密钥就会被加载。确保Node.js的openssl版本是正确的。
+0
这听起来像你可能有一个隐藏的ABI兼容性问题。 OpenSSL 0.9.8没有EC支持。 OpenSSL 1.0.0(及以上版本)有EC支持。如果Node是针对0.9.8构建的,那么您不能交换1.x共享对象,因为它们不是二进制兼容的。反之亦然。如果你遭受不明原因的崩溃,那么使用OpenSSL 1.x重建节点(如1.0.2)。不明原因的碰撞通常是ABI问题的症状。 – jww 2015-04-01 07:26:36
你有没有试过http://stackoverflow.com/questions/20837161/openssl-pem-routinespem-read-biono-start-linepem-lib-c703expecting-truste? – 2015-03-31 19:52:05
是的,所有信息都由openssl(v1.0.2a)正确打印。问题在于使用EC密钥而不是RSA密钥。 – Maneesh 2015-03-31 21:23:42
'cat'既有'client-key.pem'和'client-cert.pem'。它们是否是人类可读的,并以熟悉的'--- BEGIN ... -----'开头,并以'--- END ... -----'结尾?如果是这样,那么它听起来像OpenSSL 0.9.8或更低版本。 EC支持被添加到1.0.0(或者1.0.1)。 – jww 2015-04-01 07:24:32