2017-05-26 111 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