2017-09-26 157 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证书,而不是...