分享交流
合作共赢!

自建SSl证书

一、简介

出于某种目的,有时候需要自建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设置协商加密算法时,优先使用我们服务端的加密套件,而不是客户端浏览器的加密套件。

赞(3) 打赏
未经允许不得转载:琼杰笔记 » 自建SSl证书

评论 抢沙发

评论前必须登录!

 

分享交流,合作共赢!

联系我们加入QQ群

觉得文章有用就打赏一下文章作者

非常感谢你的打赏,我们将继续给力更多优质内容,让我们一起创建更加美好的网络世界!

支付宝扫一扫打赏

微信扫一扫打赏