2017-05-26 33 views
0

节点不断给我时,我试图阅读我的自我签名的SSL证书加载OpenSSL的证书到节点

_tls_common.js:67 
    c.context.setCert(options.cert); 
      ^

Error: error:0906D06C:PEM routines:PEM_read_bio:no start line 
    at Error (native) 
    at Object.createSecureContext (_tls_common.js:67:17) 
    at Object.TLSSocket._init.ssl.onclienthello.ssl.oncertcb.exports.connect (_tls_wrap.js:1017:46) 
    at Socket.<anonymous> (/usr/blinkchannelserver/bundle/programs/server/npm/node_modules/pg/lib/connection.js:106:23) 
    at Socket.g (events.js:260:16) 
    at emitOne (events.js:77:13) 
    at Socket.emit (events.js:169:7) 
    at readableAddChunk (_stream_readable.js:153:18) 
    at Socket.Readable.push (_stream_readable.js:111:10) 
    at TCP.onread (net.js:540:20) 

被这个所谓的什么格式,是在这个错误?

我的服务器上,我创建了一个客户端密钥和CSR运行

openssl req -new -key ~/.postgresql/postgresql.key -out /tmp/postgresql.csr 

我用我的服务器键打开CSR到证书使用我的服务器的证书次关键

openssl x509 -req -in /tmp/postgresql.csr -CA server.cert -CAkey server.key -out /tmp/postgresql.cert -CAcreateserial 

当我试图丢失postgresql.cert我得到上面的错误

运行x509:

openssl x509 -inform PEM -in postgresql.cert 

给我一个合理的输出:

-----BEGIN CERTIFICATE----- 
MIIDHDCCAgQCCQC8AZE7dSSPZDANBgkqhkiG9w0BAQsFADBRMQswCQYDVQQGEwJH 
QjEPMA0GA1UEBwwGTG9uZG9uMR4wHAYDVQQKDBVEb3VnbGFzLVdoaXRlICYgR29z 
... 
-----END CERTIFICATE----- 
+0

如果你的CN是***'CN = www.example.com' ***,那么它是可能是错的。主机名始终在* SAN *中。如果它存在于* CN *中,那么它也必须存在于* SAN *中(在这种情况下,您必须列出它两次)。有关更多规则和原因,请参阅[如何使用您的证书颁发机构签署证书签名请求](http://stackoverflow.com/a/21340898/608639)和[如何使用openssl创建自签名证书?]( http://stackoverflow.com/q/10175812/608639)您还需要将自签名证书放入适当的信任库中。 – jww

回答

0

当文件与非Unix行结尾的编码这通常发生。你可以打开他的文件,它会在行尾显示一些奇怪的字符,比如'^ M'。

将文件转换为unix格式OpenSSL将能够处理它。尝试运行一些“sed的”命令(取决于编码),或像“dos2unix”专用工具

sed 's/^M$//' infile.txt > outfile.txt 

sed 's/\r$//' infile.txt > outfile.txt 
+0

PEM在[RFC 1421,互联网电子邮件的隐私增强](https://tools.ietf.org/html/rfc1421)中得到了标准化。该标准在第4.3.1节(第10页)中呼叫CR-LF行尾:*“由字符对定界的文本行的长度不得超过1000个字符”*。当时还有两个RFC,SMTP和FTP,都使用了相同的行尾。如果Node.js不能处理换行符,那么它可能是Node.js中的一个错误。 – jww