CentOS7 OpenSSL制作自签证书HTTP升级HTTPS 配置

697 阅读5分钟

前言

哈喽,小伙伴们,我是泽南Zn👨‍🎓。最近做项目的时候要求将http升级成https,但是甲方并没有提供证书,所以只能先自己生成然后去演练,本篇文章介绍了通过使用openssl生成自签证书的过程,过程很清晰哦,只要跟着做下去,都会很顺利的生成证书并且完成配置。话不多说,直接进入主题!

一、openssl 简介

openssl 是目前最流行的 SSL 密码库工具,其提供了一个通用、健壮、功能完备的工具套件,用以支持SSL/TLS 协议的实现。
官网:www.openssl.org/source/

构成部分:

  • 密码算法库
  • 密钥和证书封装管理功能
  • SSL通信API接口

用途

  • 建立 RSA、DH、DSA key 参数
  • 建立 X.509 证书、证书签名请求(CSR)和CRLs(证书回收列表)
  • 计算消息摘要
  • 使用各种 Cipher加密/解密
  • SSL/TLS 客户端以及服务器的测试
  • 处理S/MIME 或者加密邮件

二、 数字证书 概念

  • 在HTTPS的传输过程中,有一个非常关键的角色——数字证书,那什么是数字证书?又有什么作用呢?
  • 所谓数字证书,是一种用于电脑的身份识别机制。由数字证书颁发机构(CA)对使用私钥创建的签名请求文件做的签名(盖章),表示CA结构对证书持有者的认可。数字证书拥有以下几个优点:
    • 使用数字证书能够提高用户的可信度 数字证书中的 公钥,能够与服务端的私钥配对使用,实现数据传输过程中的加密和解密
    • 在证认使用者身份期间,使用者的敏感个人数据并不会被传输至证书持有者的网络系统上 X.509证书包含三个文件:keycsrcrt

key【密钥/私钥 Private Key】是服务器上的私钥文件,用于对发送给客户端数据的加密,以及对从客户端接收到数据的解密

csr【证书认证签名请求 Certificate signing request】是证书签名请求文件,用于提交给证书颁发机构(CA)对证书签名

crt【证书 Certificate】是由证书颁发机构(CA)签名后的证书,或者是开发者自签名的证书,包含证书持有人的信息,持有人的公钥,以及签署者的签名等信息

备注:在密码学中,X.509是一个标准,规范了公开秘钥认证、证书吊销列表、授权凭证、凭证路径验证算法等。

-req 产生证书签发申请命令
-newkey 生成新私钥 rsa:4096 生成秘钥位数
-nodes 表示私钥不加密
-sha256 使用SHA-2哈希算法
-keyout 将新创建的私钥写入的文件名
-x509 签发X.509格式证书命令。X.509是最通用的一种签名证书格式。
-out 指定要写入的输出文件名
-subj 指定用户信息
-days 有效期(3650表示十年)

三、 基本流程

1、 安装 openssl

yum install openssl -y

image.png

2、 虚构一个CA认证机构

# 生成CA认证机构的证书密钥key    注:本文密码以1234为例
# 需要设置密码,输入两次
openssl>openssl genrsa -des3 -out ca.key 1024

# 去除密钥里的密码(可选)
# 这里需要再输入一次原来设的密码
openssl>openssl rsa -in ca.key -out ca.key

# 用私钥ca.key生成CA认证机构的证书ca.crt
# 其实就是相当于用私钥生成公钥,再把公钥包装成证书
openssl>openssl req -new -x509 -key ca.key -out ca.crt -days 365

subj参数说明:
/C=CN        # Country 国家
/ST=beijing  # State or Province 省
/L=beijing   # Location or City 城市
/O=ziqian    # Organization 组织或企业
/OU=ziqian   # Organization Unit 部门
/CN=ziqian   # Common Name 域名或IP

示例:-subj "/C=CN/ST=beijing/L=beijing/O=ziqian/OU=ziqian/CN=ziqian"

# 这个证书ca.crt有的又称为"根证书",因为可以用来认证其他证书

image.png

image.png

3、 生成网站的证书

用上面那个虚构出来的CA机构来认证,免费生成证书。

# 生成自己网站的密钥server.key (如果设置为 1024 会报错,SSL: error:140AB18F:SSL routines:SSL_CTX_use_certificate:ee key too small)
openssl>openssl genrsa -des3 -out server.key 2048

# 生成自己网站证书的请求文件
# 如果找外面的CA机构认证,也是发个请求文件给他们
# 这个私钥就包含在请求文件中了,认证机构要用它来生成网站的公钥,然后包装成一个证书
openssl>openssl req -new -key server.key -out server.csr

# 使用虚拟的CA认证机构的证书ca.crt,来对自己网站的证书请求文件server.csr进行处理,生成签名后的证书server.crt
# 注意设置序列号和有效期(一般都设1年)
openssl>openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out server.crt -days 365

生成的信息:subject=/C=CN/ST=beijing/L=beijing/O=ziqian/OU=ziqian/CN=ziqian/emailAddress=12345@qq.com

image.png

至此,私钥server.key和证书server.crt已全部生成完毕,可以放到网站源代码中去用了。可以去服务器的根目录下查看

image.png

四、 配置

在 nginx 的配置文件下,新建一个监听443的 server:

upstream page {
   server 10.10.10.7:3003 max_fails=20 fail_timeout=60s;
}
    server{
        listen 443 ssl;
        #对应你的域名
        server_name ziqian.com;
        ssl_certificate /etc/nginx/ssl/ssl.crt;
        ssl_certificate_key /etc/nginx/ssl/ssl.key;
        ssl_session_timeout 5m;
        ssl_session_cache  shared:SSL:1m;
        ssl_protocols SSLv2 SSLv3 TLSv1;  ##指定密码为openssl支持的格式
        ssl_ciphers HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers on;
        #如果是静态文件,直接指向目录,如果是动态应用,用proxy_pass转发一下
        location / {
                root /usr/local/service/ROOT;
                index index.html;
                proxy_pass https://page/api/login;   //至此nginx配置完毕
        }
    }
    #监听80端口,并重定向到443
    server {
    listen 80;
    server_name ziqian.com; #证书绑定的域名。
    rewrite ^(.*)$ https://$host$1; #将所有HTTP请求通过rewrite指令重定向到HTTPS。
}

注意!!!!!!!!!!

Dockerfile里加一行代码

COPY ./docker/ssl /etc/nginx/ssl/

总结

使用openssl生成自签证书并配置到nginx完毕,其中涉及填写一些信息,文中都已标明注释,要记住最开始设置的密码,3位以上,如果忘记了,那就重新来过。至此http也可以升级成https啦~