公司现在做的是医疗项目,现在使用的还全部是http网络协议;一方面现在数据是裸奔状态对用户信息没有保障,另一方面https已经是大势所趋,因为用户们对自己的信息安全也越来越重视;还有从技术上来说,如果使用https网络协议,就免去了自己去做加密这一部分工作。
所以想自己先做一个完整的测试,为后续项目的更新打下基础;先说一下我的环境:centos6.5操作系统,用nginx做代理,网站部署在tomcat上面,网站开发用的是jsp。
由于是内网测试,所以需要自己假设一台DNS服务器,或者修改本机的hosts文件,可以进行域名访问,我的是mac系统,我修改了本机的hosts文件,如下:
sudo vi /etc/hosts
然后在里面加入下面一句,前面是服务器ip地址,后面是域名:
192.168.9.12 101.linuxidc.com
一、大致步骤。
1、安装openssl,需要首先安装gcc、zlib,一般系统自带的openssl版本过旧需要安装新的,看我的另一篇文章:安装openssl
2、生成自签证书,并给证书请求文件签名
3、安装nginx(https环境),需要首先安装pcre、zlib、openssl,看我的另一篇文章:安装nginx(支持SSL模块) ,然后配置nginx.
二、说下自签过程(转自:http://www.linuxidc.com/Linux/2016-09/134826.htm)
前提:
1、主机要先安装openssl
2、编译安装nginx时,要加上--with-openssl和--with-http_ssl_module
1、生成自签字证书
[root@101 /]# openssl req -new -x509 -keyout /root/ca.key -out /root/ca.crt
Generating a 2048 bit RSA private key
.............+++
...................................+++
writing new private key to '/root/ca.key'
Enter PEM pass phrase: #输入密钥保护密码
Verifying - Enter PEM pass phrase: #确认密码保护密码
-----
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) [XX]:CN
State or Province Name (full name) []:guangzhou
Locality Name (eg, city) [Default City]:guangzhou
Organization Name (eg, company) [Default Company Ltd]:linuxidc
Organizational Unit Name (eg, section) []:it
Common Name (eg, your name or your server's hostname) []:101.linuxidc.com
Email Address []:[email protected]
2、修改配置文件openssl.cnf
vim /etc/pki/tls/openssl.cnf
[ ca ]
default_ca = CA_default # The default ca section
####################################################################
[ CA_default ]
dir = /etc/pki/CA #证书的根目录,要记住这个目录
certs = $dir/certs
crl_dir = $dir/crl
database = $dir/index.txt
#unique_subject = no
new_certs_dir = $dir/newcerts
certificate = $dir/ca.crt # 修改这里,表示签名时使用的证书
serial = $dir/serial
crlnumber = $dir/crlnumber
crl = $dir/crl.pem
private_key = $dir/private/cakey.pem
RANDFILE = $dir/private/.rand
3、复制证书到证书根目录/etc/pki/CA下,并在该目录下创建空文件index.txt和serial,并向serial输入”01“
cd /etc/pki/CA
cp /root/ca.crt .
touch index.txt
touch serial
echo "01" >serial
4、生成服务器RSA私钥/root/server.key
openssl genrsa -des3 -out /root/server.key 1024
5、为私钥去除口令
openssl rsa -in /root/server.key -out /root/server_nopwd.key
5、生成证书请求文件/root/server.csr
[root@101 /]# openssl req -new -key /root/server.key -out /root/server.csr
Enter pass phrase for /root/server.key: #输入第4步生成的密钥的保护密码
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) [XX]:CN
State or Province Name (full name) []:guangzhou
Locality Name (eg, city) [Default City]:guangzhou
Organization Name (eg, company) [Default Company Ltd]:linuxidc
Organizational Unit Name (eg, section) []:it
Common Name (eg, your name or your server's hostname) []:101.linuxidc.com
----------------------------------------------------------------
Email Address []:[email protected]
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:www.linuxidc.com
An optional company name []:linuxidc
6、用私有证书给证书请求文件/root/server.csr签名
[root@101 CA]# openssl ca -in /root/server.csr -out /root/server.crt -cert /root/ca.crt -keyfile /root/ca.key -config /etc/pki/tls/openssl.cnf
Using configuration from /etc/pki/tls/openssl.cnf
Enter pass phrase for ca.key:
Check that the request matches the signature
Signature ok
Certificate Details:
Serial Number: 1 (0x1)
Validity
Not Before: Aug 31 14:09:15 2016 GMT
Not After : Aug 31 14:09:15 2017 GMT
Subject:
countryName = CN
stateOrProvinceName = guangzhou
organizationName = linuxidc
organizationalUnitName = it
commonName = 101.linuxidc.com
emailAddress = [email protected]
X509v3 extensions:
X509v3 Basic Constraints:
CA:FALSE
Netscape Comment:
OpenSSL Generated Certificate
X509v3 Subject Key Identifier:
18:80:30:B7:C6:11:61:AE:F3:62:9D:D0:33:D9:97:CB:45:5A:31:91
X509v3 Authority Key Identifier:
keyid:DA:99:4B:9B:29:A8:D8:14:54:FA:52:4B:1E:C3:E0:81:C6:A6:EF:42
Certificate is to be certified until Aug 31 14:09:15 2017 GMT (365 days)
Sign the certificate? [y/n]:yes
out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated
7、编辑nginx配置文件/etc/nginx/nginx.conf
-------在配置文件的特定区域加入/修改下面内容
server {
listen 443 ssl; #设置监听的端口
server_name linuxidc;
ssl on;
ssl_certificate /root/server.crt;
ssl_certificate_key /root/server_nopwd.key;
8、重启服务
~~~~完成,在客户端上输入https://x.x.x.x即可访问
上面配置好以后,由于网站部署在tomcat下面并且是用jsp开发的,所以还需要配置nginx访问静态资源,完整配置如下:
server {
listen 443;
server_name 101.linuxidc.com;
location / {
proxy_pass http://192.168.9.12:8081/;
root /项目名/;
proxy_redirect off ;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_next_upstream error timeout invalid_header;
}
location ~ .*\.(html|htm|ico|png|jpg|jpeg|js|css|bmp)$ {
proxy_pass http://192.168.9.12:8081;
}
}
tomcat下面的server.xml也需要配置:
1、在Engine标签下面加入
nginx:
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
tomcat server.xml:
remoteIpHeader="X-Forwarded-For"
protocolHeader="X-Forwarded-Proto"
protocolHeaderHttpsValue="https"/>
这样配置,可以是jsp中的request.getScheme()等函数,取到的一直是http而非实际的http或https。
2、server.xml中,Host标签下,需要添加Context标签,这样可以不用加项目名字直接通过域名访问,比如www.baidu.com而不是www.baidu.com/baidu
unpackWARs="true" autoDeploy="true">