无法在Node.js App中使用SSL

时间:2012-07-15 06:00:52

标签: node.js ssl

EDITED

我正在尝试让SSL在应用上工作,但我无法让它工作。我在解决问题时遇到问题。

我已经创建了一个基本应用来测试它:

var https = require('https');
var fs = require('fs');

var options = {
  key: fs.readFileSync('./ssl/server_key.pem'),
  cert: fs.readFileSync('./ssl/server_crt.pem'),
  passphrase: 'mypassphrase',
  ca: fs.readFileSync('./ssl/cacert.pem'),
  requestCert: true,
  rejectUnauthorized: false
};

https.createServer(options, function (req, res) {
  console.log('req.client.authorized: %s', req.client.authorized);
  if (req.client.authorized) {
    res.writeHead(200);
    res.end("hello world\n");
  }
  else {
    res.writeHead(404);
    res.end("Not authorised\n");
  }

}).listen(3000);
console.log('Server started...');

我使用Ubuntu Documentation on OpenSSL创建了证书。我使用的过程是:

  1. 创建证书颁发机构根证书和密钥

      

    导出OPENSSL_CONF =〜/ myCA / caconfig.cnf

         

    openssl req -x509 -newkey rsa:2048 -out cacert.pem -outform PEM -days 1825

    生成:CA公共证书'cacert.pem';和CA私钥'cakey.pem'

  2. 创建自签名服务器证书

      

    导出OPENSSL_CONF =〜/ myCA / exampleserver.cnf

         

    openssl req -newkey rsa:1024 -keyout tempkey.pem -keyform PEM -out tempreq.pem -outform PEM

         

    mv tempkey.pem server_key.pem

         

    导出OPENSSL_CONF =〜/ myCA / caconfig.cnf

         

    openssl ca -in tempreq.pem -out server_crt.pem

    生成:服务器应用程序证书文件'server_crt.pem';和服务器应用程序密钥文件'server_key.pem'。

  3. 从服务器的Root CA X.509证书创建PKCS#12证书以供客户端使用

      

    openssl req -x509 -nodes -days 365 -newkey rsa:1024 -keyout mycert.pem -out mycert.pem

         

    openssl pkcs12 -export -out mycert.pfx -in mycert.pem -name“MySite证书”

    导致文件'mycert.pfx'。

  4. 将文件复制到app的ssl目录

    我将文件'cacert.pem','server_key.pem'和'server_crt.pem'复制到应用程序的ssl目录。

  5. 通过Firefox的内置证书管理器将文件'mycert.pfx'导入Firefox(我将其导入标有“您的证书”的标签中)。

  6. 在Firefox中输入网址(https://ssl:3000

    此时我收到来自Firefox的“用户识别请求”,我从中选择了我的证书。然后我收到Firefox的错误说:

    “...安全连接失败  连接到ssl:3000期间发生错误。  同行的证书签名无效。  (错误代码:sec_error_bad_signature)...“

  7. 我尝试使用curl -v -s -k -E mycert.pem:somepassword https://ssl:3000进行故障排除,并收到以下输出:

      
        
    • 即将连接()到ssl端口3000(#0)
    •   
    • 尝试XXX.XXX.XXX.XXX ...已连接
    •   
    • 成功设置证书验证位置:
    •   
    • CAfile:无   CApath:/ etc / ssl / certs
    •   
    • SSLv3,TLS握手,客户端问候(1):
    •   
    • SSLv3,TLS握手,服务器问候(2):
    •   
    • SSLv3,TLS握手,CERT(11):
    •   
    • SSLv3,TLS握手,请求CERT(13):
    •   
    • SSLv3,TLS握手,服务器完成(14):
    •   
    • SSLv3,TLS握手,CERT(11):
    •   
    • SSLv3,TLS握手,客户端密钥交换(16):
    •   
    • SSLv3,TLS握手,CERT验证(15):
    •   
    • SSLv3,TLS更改密码,客户端问候(1):
    •   
    • SSLv3,TLS握手,已完成(20):
    •   
    • SSLv3,TLS更改密码,客户端问候(1):
    •   
    • SSLv3,TLS握手,已完成(20):
    •   
    • 使用AES256-SHA进行SSL连接
    •   
    • 服务器证书:
    •   
    • 主题:CN = ssl; ST =北京; C = CN; EMAILADDRESS =根@本地; O = Bengul公司; OU =卧室
    •   
    • 开始日期:2012-07-17 05:11:49 GMT
    •   
    • 到期日期:2017-07-16 05:11:49 GMT
    •   
    • subjectAltName:ssl matching
    •   
    • 发行人:CN = ssl; ST =北京; C = CN; EMAILADDRESS =根@本地; O = Bengul公司; OU =卧室
    •   
    • SSL证书验证结果:自签名证书(18),无论如何都要继续。   GET / HTTP / 1.1   User-Agent:curl / 7.22.0(i686-pc-linux-gnu)libcurl / 7.22.0 OpenSSL / 1.0.1 zlib / 1.2.3.4 libidn / 1.23 librtmp / 2.3   主持人:ssl:3000   接受: /
    •   
         

    HTTP / 1.1 404 Not Found

         

    日期:2012年7月17日星期二05:22:04 GMT

         

    连接:保持活力

         

    Transfer-Encoding:chunked

         

    未经授权

         
        
    • 连接#0以主机ssl保持原样
    •   
    • 关闭连接#0
    •   
    • SSLv3,TLS警报,客户问候(1):
    •   

    如果我然后运行netstat我得到这个输出:

      

    有效的互联网连接(没有服务器)

         

    Proto Recv-Q Send-Q本地地址外部地址状态

         

    tcp 0 0 ssl:55719 ssl:3000 TIME_WAIT

    我无法弄清楚我做错了什么。如果有人能指出我正确的方向,我将非常感激。

1 个答案:

答案 0 :(得分:0)

我最近在node.js中实现了一个支持SSL的简单代理服务器。也许这可以帮助您调试解决方案。您可以在我的Github项目中找到生成自签名证书的代码和简短说明:https://github.com/alienhard/malinger