项目自签名ssl证书,配置https
一、自签名证书:
准备ssl证书一份,这里使用JDK生成秘钥证书:
Win+R 输入cmd,调出命令行窗口
在命令行窗口输入,生成命令:
keytool -genkey -alias myssl -storetype PKCS12 -keyalg RSA -keysize 2048 -keystore G: keystore.p12 -validity 365
(1)关键字解释:
* alias 密钥别名
* storetype 指定密钥仓库类型
* keyalg 生证书的算法名称,RSA是一种非对称加密算法
* keysize 证书大小
* keystore 生成的证书文件的存储路径 (我这里选择在G盘下)
* validity 证书的有效期 (这里设置为一年)
(2)生成证书注意:
在输入证书生成命令之后,会提示输入:
- 密钥库口令:证书密码,在后面的项目中配置证书时用到
- 姓氏:一般没什么用,在浏览器中查看证书时会显示,用于正式场合的证书还是需要填写标准。
- 组织单位:证书使用单位信息,一般没什么用,在浏览器中查看证书时会显示,用于正式场合的证书还是需要填写标准。
- 组织单位名称:证书使用单位名称,一般没什么用,在浏览器中查看证书时会显示,用于正式场合的证书还是需要填写标准。
- 所在的城市或区域名称:浏览器中查看证书信息时会显示。
- 所在的省/市/自治区名称:浏览器中查看证书信息时会显示。
- 单位的双字母国家/地区代码:国家或地区编码,浏览器中查看证书信息时会显示。
二、将生成的密钥证书拷贝到项目中的resource中(也可以不拷贝到项目中,后面配置路径时配置密钥证书的绝对路径即可)
三、修改项目配置文件application.properties,增加如下配置项
server.ssl.key-store=classpath:keystore.p12 #证书文件路径,也可以配置绝对路径
server.ssl.key-store-password=jyd666 #证书密码,证书生成时输入的密钥库口令
server.ssl.keyStoreType=PKCS12 #证书类型,与证书生成命令一致
server.ssl.keyAlias=jydssl #证书别名,与证书生成命令一致
如果是application.yml配置文件:
server:
# 服务器的HTTP端口,默认为80
port: 9999
ssl:
key-store: classpath:keystore.p12 #证书文件路径
key-store-password: jyd666 #证书密码
key-store-type: PKCS12 #证书类型
key-alias: jydssl #证书别名
四、之后启动项目访问https路径即可
Linux-nginx配置https
一、需要的环境:
配置nginx支持https协议访问,需要在编译安装nginx的时候添加相应的模块--with-http_ssl_module
查看nginx编译参数:/usr/local/nginx/sbin/nginx -V
)
如果没有--with-http_gzip_static_module
这个参数,需要重新编辑nginx
二、创建https证书:
确保机器上安装了openssl 和 openssl-devel
yum install openssl openssl-devel # CentOS使用yum命令安装
mkdir /usr/local/nginx/conf/ssl # 创建证书存放目录
cd /usr/local/nginx/conf/ssl # 进入目录
创建服务器私钥:openssl genrsa -des3 -out server.key 1024 #根据提示输入证书口令
)
- 创立根证书密钥文件(自己做CA)root.key:
[root@linux ssl]# openssl genrsa -des3 -out root.key
Generating RSA private key, 512 bit long modulus
……………..++++++++++++
..++++++++++++
e is 65537 (0×10001)
Enter pass phrase for root.key: ← 输入一个新密码
Verifying – Enter pass phrase for root.key: ← 重新输入一遍密码
- 创立根证书的申请文件root.csr:
[root@linux ssl]# openssl req -new -key server.key -out server.csr
Enter pass phrase for root.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 ‘.whflsc.com’, the field will be left blank.
Country Name (2 letter code) [XX]:cn #国家,中国输入CN
State or Province Name (full name) []:zhejiang #省份
Locality Name (eg, city) [Default City]:hangzhou #城市
Organization Name (eg, company) [Default Company Ltd]:osyunwei #公司
Organizational Unit Name (eg, section) []:sys #部门
Common Name (eg, your name or your server's hostname) []:osyunwei #主机名称
Email Address []:xxx@qq.com #邮箱
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:123456 #证书请求密钥,CA读取证书的时候需要输入密码
An optional company name []:osyunwei #公司名称,CA读取证书的时候需要输入密码
openssl rsa -in server.key -out server_nopassword.key #对key进行解密
- 创立一个自目前日期起为期十年的根证书root.crt:
[root@linux ssl]# openssl x509 -req -days 3650 -in server.csr -signkey server_nopassword.key -out server.crt
三、修改nginx配置文件,加载ssl证书
修改nginx.conf配置:
[root@linux ssl]# vim /usr/local/nginx/conf/nginx.conf # 编辑
找到 HTTPS server块,放开除HTTPS server的注释
进行如下修改:
# HTTPS server
server {
listen 443 ssl;
server_name localhost;
ssl_certificate /usr/local/nginx/conf/ssl/server.crt; #cert/证书名称.pem;
ssl_certificate_key /usr/local/nginx/conf/ssl/server_nopassword.key; #cert/证书名称.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
proxy_pass https://127.0.0.1:9999/; #需要代理的项目路径
#root html;
#index index.html index.htm;
}
}
:wq! #保存退出
下面是个人的配置:
nginx端口为8888,代理项目端口9999,之后访问项目只需访问https://域名或ip/8888
(这里并没有使用默认端口443,使用其他端口则需要在linux中开放对应的端口,因为linux默认不开放端口,开放端口的方法在后面↓)
配置完成后退出编辑,重启nginx:
/usr/local/nginx/sbin/nginx -s reload # 重启nginx
/usr/local/nginx/sbin/nginx -t # 检查nginx是否启动成功
四、linux防火墙开启https协议端口8888
linux中输入如下命令:
vi /etc/sysconfig/iptables # 编辑防火墙配置文件
添加以下代码:
-A INPUT -m state --state NEW -m tcp -p tcp --dport 8888 -j ACCEPT
之后,
:wq! # 保存退出
再重启防火墙:
service iptables restart #重启防火墙
鉴于linux版本不同,如果你的linux不支持上述命令,那么用下面的firewall命令:
# 打开8888/TCP端口
firewall-cmd --add-port=8888/tcp
# 永久打开8888/TCP端口
firewall-cmd --permanent --add-port=8888/tcp
# 永久打开端口需要reload一下,临时打开不用,如果用了reload临时打开的端口就失效了
# 重启防火墙
firewall-cmd --reload
# 查看防火墙
firewall-cmd --list-all
ps:关闭端口
firewall-cmd --remove-port=80/tcp --permanent
firewall-cmd --reload
五、访问项目
自此完毕,访问项目路径进行测试。
六、缺少SSL模块错误
若出现nginx:[emerg]unknown directive ssl
这个错误提示,是因为编译Nginx的时候并没有把SSL模块一起编译进去。
错误解决步骤:
我们只需要在原有的基础上添加ssl模块,不需要重新安装Nginx。
首先,我们cd到当初下载nginx的包压缩的解压目录,我这里的解压目录在“/usr/loacl/nginx/”。
进入到解压目录下后,按顺序执行一下命令:
./configure --with-http_ssl_module # 重新添加ssl模块
若执行上面这条命令出现错误:(./configure:错误:SSL模块需要OpenSSL库。),是因为缺少了OpenSSL,所以我们要先安装一个openssl,执行:yum -y install openssl openssl-devel
等待OpenSSL的安装完成后,再执行./configure --with-http_ssl_module
。- 安装好ssl后执行
make
命令,不要执行make install
(make是用来编译的,而make install是安装,不然整个nginx会被重新覆盖)。 - 之后在nginx解压目录下,objs文件夹中多了一个nginx的文件,把这个新的nginx文件复制过去覆盖之前的nginx(保险起见先备份一下之前的nginx)。
cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.bak
cp objs/nginx /usr/local/nginx/sbin/nginx
- 最后cd到Nginx安装目录下,查看ssl模块安装是否成功:
./sbin/nginx -V