2017-09-26 160 views
1

我想用https啓動我的Web應用程序。我創建了自簽名密鑰和證書使用下面的命令:Express JS,使用HTTPS不會加載頁面

openssl req -newkey rsa:2048 -sha256 -nodes -keyout key.key -x509 -days 365 -out public.pem -subj "/C=US/ST=New York/L=Brooklyn/O=Example Brooklyn Company/CN=my.example.com" 

這創造了我key.key NAD public.pem文件。

現在我想將它們分配給我的Express應用程序:

const app = express(); 
const https = require('https'); 
const http = require('http'); 
const fs = require('fs'); 

app.get('/*', (req, res) => { 
     res.send("Hello"); 
}); 

const options = { 
    key: fs.readFileSync(`${__dirname}/key.key`), // Path to file with PEM private key 
    cert: fs.readFileSync(`${__dirname}/public.pem`) // Path to file with PEM certificate 
}; 
https.createServer(options, app).listen(443); 
http.createServer(app).listen(80); 

當我打開我的my.example.com/它成功地顯示我Hello消息文本。 不管怎樣,當我像這樣打開它https://my.example.com/我的瀏覽器不打開此頁面並顯示ERR_SSL_PROTOCOL_ERROR錯誤消息。

我錯過了什麼?

+0

是什麼'options'? – baao

+0

@baao哎呀。我已更新我的問題 –

+0

如果指定了編碼選項,則fs.readFileSync會返回一個字符串,否則會返回一個緩衝區。因此,您需要指定編碼以將內容作爲字符串獲取。 – baao

回答

2

嘗試添加後續的代碼,我認爲這是你需要到https

var fs = require('fs'); 
var https = require('https'); 
var express = require('express'); 
var key = fs.readFileSync('sslcert/server.key', 'utf8'); 
var cert = fs.readFileSync('sslcert/server.crt', 'utf8'); 

var cred = {key: key, cert: cert}; 
var app = express(); 

var serv = https.createServer(cred, app); 

serv.listen(443); 

我希望這個作品給你

+0

即使II添加了'utf8'encoding打開'https'頁面不工作 –

1

可能是你的SSL建立不正確打開由什麼。

嘗試:

openssl genrsa -out key.pem 2048 
openssl req -new -key key.pem -out client.csr 
openssl x509 -req -in client.csr -signkey key.pem -out cert.pem 
+0

我已經放置了新生成的兩個'pem'文件,而且我的瀏覽器仍然拋出錯誤'ERR_SSL_PROTOCOL_ERROR' –

+2

'ERR_SSL_PROTOCOL_ERROR'意味着瀏覽器無法驗證服務器提供的證書並認爲它是假的,這是因爲它沒有由任何_trusted_第三方簽名(它由您簽名) 。爲了避免這種情況,請嘗試將證書添加到瀏覽器中。 [查看更多](https://stackoverflow.com/questions/7580508/getting-chrome-to-accept-self-signed-localhost-certificate) –

1

我相信有什麼不對您的代碼和邏輯...... 如果您使用的是Chrome瀏覽器,它給出了這樣的錯誤很可能是因爲您使用的是自在測試的情況下籤署的證書......

有一個辦法解決......但我建議如果可以的話,你買一個SSL證書,而不是...