您的位置:首页 > 理论基础 > 计算机网络

Amazon EC2 Instance Express API配置HTTPS

2017-01-05 08:10 429 查看
最近在做一个API的项目,放在Amazon EC2上跑,为了提高安全性想把链接搞成HTTPS的。API放在Express上,GoDaddy上面没有Node Server配置的教程,搜到很多教程都是通过AWS Load Balancer来配置的,所以自己把各教程综合了一下,完成了配置。

第一步:买一个SSL证书

我看很多人都是自己签发证书。但是我因为有折扣,打完折之后$3/年,很便宜,就直接从GoDaddy买了。 

第二步:生成CSR

买完证书之后,在账户里进行配置的时候发现GoDaddy要求输入CSR。生成CSR这一部分需要在EC2 Instance里面完成。主要是根据Creating And Installing A SSL Certificate On Amazon EC2 里面第1-6步来做的。

1. 生成私钥(private key)

$ openssl genrsa -des3 -out host.key 2048
Generating RSA private key, 2048 bit long modulus
..................................................+++
...............................+++
e is 65537 (0x10001)
Enter pass phrase for host.key:
Verifying - Enter pass phrase for host.key:


注意:(1) EC2里openssl是装好可以直接用的。

            (2) pass phrase要记住,后面还要用

2. 用私钥生成certificate signing request,也就是前面所提到的CSR。

$ openssl req -new -key host.key -out host.csr


输入这个命令之后openssl会让你输入上一步里提到的pass phrase,然后在输入若干跟你的网站和公司有关的信息如下。其中Organizational Unit Name和Common Name是最重要的,要输入你的网站的域名,其他可以随便填。

Enter pass phrase for host.key:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:US
State or Province Name (full name) [Some-State]:Missouri
Locality Name (eg, city) []:Saint Louis
Organization Name (eg, company) [Internet Widgits Pty Ltd]:My Company
Organizational Unit Name (eg, section) []:www.mycompany.com
Common Name (e.g. server FQDN or YOUR name) []:www.mycompany.com
Email Address []:contact@mycompany.com

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:


第三步:提交CSR

1. 上面的命令完成后会生成一个host.csr,用vi打开这个csr文件,会看到:

-----BEGIN CERTIFICATE REQUEST-----
[encoded text here]
-----END CERTIFICATE REQUEST-----
把这个文件的内容(包括“BEGIN CERTIFICATE REQUEST”和“END CERTIFICATE REQUEST”这两行)复制黏贴到GoDaddy的CSR request form里,提交,等待GoDaddy验证审批完成。

2. 审批完成之后,GoDaddy会生成一个压缩包,里面有两个crt文件(一个随机命名的crt文件和一个gd_bundle.crt文件)。

第四步:上传.crt文件

我的笔记本是windows系统,所以需要下载一个WinSCP,通过这个软件把crt文件上传到EC2。

这个软件跟Putty很类似,用法跟通过putty ssh到ec2一样,用过putty ssh ec2的筒子们应该都很熟悉。主机名就是你的ec2主机名,ec2-xx-xx-xxx-xxx.us-west-x.compute.amazonaws.com,端口22也就是ssh,协议sftp,用户名ubuntu(我的ec2是ubuntu),密码空置。

唯一需要注意的是,要点击“编辑” ==〉“高级”  ==〉“SSH” ==〉“验证” ==〉“密钥文件”,把你的ec2的私钥(.ppk)文件的路径输进去。

具体的详细步骤请见 http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/putty.html#Transfer_WinSCP 

ssh连接建立好后就可以很方便的把本地的crt文件上传的ec2了。

第五步:生成pem格式的私钥

之前的私钥host.key并不是pem格式,需要通过下面的命令把.key转成.pem

openssl rsa -in host.key -out newkey.pem && mv newkey.pem key.pem
否则你会看到错误
mgechev → MinBook Pro ~/Desktop/test Thu Apr 30 11:56:03
$ node index.js
_tls_common.js:67
c.context.setKey(options.key);
^
Error: error:0906A068:PEM routines:PEM_do_header:bad password read
at Error (native)
at Object.createSecureContext (_tls_common.js:67:17)
at Server (_tls_wrap.js:595:25)
at new Server (https.js:36:14)
at Object.exports.createServer (https.js:56:10)
at Object.<anonymous> (/Users/mgechev/Desktop/test/index.js:6:11)
at Module._compile (module.js:449:26)
at Object.Module._extensions..js (module.js:467:10)
at Module.load (module.js:349:32)
at Function.Module._load (module.js:305:12)
以上步骤来自http://blog.mgechev.com/2014/02/19/create-https-tls-ssl-application-with-express-nodejs/。

第六步:更改代码

证书和密钥设置好了,下一步需要更改代码以监听443端口。直接上代码

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

// This line is from the Node.js HTTPS documentation.
var options = {
key: fs.readFileSync('test/fixtures/keys/agent2-key.pem'),
cert: fs.readFileSync('test/fixtures/keys/agent2-cert.cert')
};

// Create a service (the app object is just a callback).
var app = express();

// Create an HTTP service.
http.createServer(app).listen(80);
// Create an HTTPS service identical to the HTTP service.
https.createServer(options, app).listen(443);
以上代码来自http://stackoverflow.com/a/14272874/2177408

第七步:运行

运行服务器之后,可能会发现程序报错

$ node server.js
events.js:154
throw er; // Unhandled 'error' event
^

Error: listen EACCES 0.0.0.0:80
这个Error可能是80端口也可能是443端口,取决于你监听哪个端口。

这是因为我们没有权限来监听这两个端口。所以需要用sudo

sudo node server.js
http://stackoverflow.com/a/39320632/2177408

完成这些步骤之后,我们就可以通过https来访问跑在ec2上的API了。

最后友情提醒一下,不要忘记在aws ec2 security group上打开443和80端口。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: