一、简介
出于某种目的,有时候需要自建SSL证书来使用。这里以Nginx为例,演示如何创建并配置ssl证书的方法。
二、创建SSL证书
1.创建存放证书的目录
~]# mkdir /etc/nginx/ssl
~]# cd /etc/nginx/ssl
2.生成一个RSA秘钥
ssl]# openssl genrsa -des3 -out nginx.key 1024
Generating RSA private key, 1024 bit long modulus
.........................................++++++
..........................++++++
e is 65537 (0x10001)
Enter pass phrase for nginx.key: # 输入自定义密码
Verifying - Enter pass phrase for nginx.key: # 确认密码
# -out 参数指定密钥文件存放的位置和名字,1024是指密钥文件的长度,一般为1024或者2048
3.生成一个证书请求
ssl]# openssl req -new -key nginx.key -out nginx.csr Enter pass phrase for nginx.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) [XX]:CN #国家名称 State or Province Name (full name) []:ShangHai #省 Locality Name (eg, city) [Default City]:ShangHai #市 Organization Name (eg, company) [Default Company Ltd]:ACBC #公司 Organizational Unit Name (eg, section) []:Tech #部门 Common Name (eg, your name or your server's hostname) []:*.jenkins.io #注意,此处应当填写你要部署的域名,如果是单个则直接添加即可,如果不确定,使用*,表示可以对所有mydomain.com的子域名做认证 Email Address []:admin@mydomain.com #以域名结尾即可 Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: #是否设置密码,可以不写直接回车 An optional company name []: #其他公司名称 可不写
# 指定密钥密钥文件来生成一个ca请求
# 这个步骤会要求填入国家区域以及域名等信息
# 最重要的一行是Common Name,需要填入与服务器关联的域名,或者是您服务器的公共IP地址
4.创建不需要输入密码的RSA证书,否则每次reload、restart都需要输入密码
ssl]# openssl rsa -in nginx.key -out nginx_nopass.key
Enter pass phrase for nginx.key: #之前RSA秘钥创建时的密码
writing RSA key
5.签发证书(由于是测试自己签发,实际应该将自己生成的csr文件提交给SSL认证机构认证)
ssl]# openssl x509 -req -days 3650 -in nginx.csr -signkey nginx.key -out nginx.crt Signature ok subject=/C=CN/ST=ShangHai/L=ShangHai/O=ACBC/OU=Tech/CN=*.mydomain.com/emailAddress=admin@mydomain.com Getting Private key Enter pass phrase for nginx.key: #RSA创建时的密码
相关参数说明
req:此子命令指定我们要使用X.509证书签名请求(CSR)管理。“X.509”是SSL和TLS为其密钥和证书管理所遵循的公钥基础结构标准。我们想要创建一个新的X.509证书,所以我们使用这个子命令
-x509:通过告诉实用程序我们要创建自签名证书而不是生成证书签名请求(通常会发生)来进一步修改上一个子命令
-nodes:这告诉OpenSSL跳过用密码保护我们的证书的选项。当服务器启动时,我们需要Nginx能够在没有用户干预的情况下读取文件。密码短语会阻止这种情况发生,因为我们必须在每次重启后输入密码
-days 3650:此选项设置证书被视为有效的时间长度。我们在这里设置了一年
生成文件的列表
- cert_req.csr 请求
- server_cert.crt 签名证书
- private.key 密钥
三、配置Nginx
server {
#listen 443 default_server;
#listen [::]:443 default_server;
listen 443 default ssl;
server_name updates.jenkins.io; # 与申请时的域名保持一致,否则会报错
root /usr/share/nginx/html;
# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;
ssl_certificate "ssl/nginx.crt";
ssl_certificate_key "ssl/nginx_nopass.key";
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 10m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
......
SSL相关配置详解:
- ssl_certificate:证书其实是个公钥,它会被发送到连接服务器的每个客户端
- ssl_certificate_key:私钥是用来解密的,所以它的权限要得到保护但nginx的主进程能够读取。当然私钥和证书可以放在一个证书文件中,这种方式也只有公钥证书才发送到client。
- ssl_session_timeout :客户端可以重用会话缓存中ssl参数的过期时间,内网系统默认5分钟太短了,可以设成30m即30分钟甚至4h。
- ssl_protocols:指令用于启动特定的加密协议,nginx在1.1.13和1.0.12版本后默认是ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2,TLSv1.1与TLSv1.2要确保OpenSSL >= 1.0.1 ,SSLv3 现在还有很多地方在用但有不少被攻击的漏洞。
- ssl_ciphers:选择加密套件,不同的浏览器所支持的套件(和顺序)可能会不同。这里指定的是OpenSSL库能够识别的写法,你可以通过 openssl -v cipher ‘RC4:HIGH:!aNULL:!MD5’(后面是你所指定的套件加密算法) 来看所支持算法。
- ssl_prefer_server_ciphers :on设置协商加密算法时,优先使用我们服务端的加密套件,而不是客户端浏览器的加密套件。
评论前必须登录!
注册