openssl 自签名ssl证书 部署nginx

参考文章

目录

一键生成自签名SSL证书和私钥

参见 create_self_signed_cert.sh

#!/usr/bin/env bash

set -e

# Locate shell script path
SCRIPT_DIR=$(dirname $0)
if [ ${SCRIPT_DIR} != '.' ]
then
  cd ${SCRIPT_DIR}
fi

# Generate RSA private key
openssl genrsa -des3 -passout pass:x -out server.pass.key 2048

# Remove password in the private key
openssl rsa -passin pass:x -in server.pass.key -out server.key
rm -f server.pass.key

# Generate CSR sign request
SUBJ="$1"
openssl req -new -key server.key -out server.csr -subj "$SUBJ"

# Generate CRT signed cert
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt

执行

./create_self_signed_cert.sh "/C=CN/ST=Guangdong/L=Guangzhou/O=xdevops/OU=xdevops/CN=gitlab.xdevops.cn"

分步骤解析生成自签名的SSL证书和私钥

第一步:生成私钥
# genra 生成RSA私钥
# -des3 des3算法
# -out server.key 生成的私钥文件名
# 2048 私钥长度
openssl genrsa -des3 -out server.pass.key 2048

输入一个4位以上的密码。

第二步:去除私钥中的密码

openssl rsa -in server.pass.key -out server.key

注意:有密码的私钥是server.pass.key,没有密码的私钥是server.key

第三步:生成CSR(证书签名请求)
# req 生成证书签名请求
# -new 新生成
# -key 私钥文件
# -out 生成的CSR文件
# -subj 生成CSR证书的参数
openssl req -new -key server.key -out server.csr -subj "/C=CN/ST=Guangdong/L=Guangzhou/O=xdevops/OU=xdevops/CN=gitlab.xdevops.cn"

subj参数说明如下:

字段 字段含义 示例
/C= Country 国家 CN
/ST= State or Province 省 Guangdong
/L= Location or City 城市 Guangzhou
/O= Organization 组织或企业 xdevops
/OU= Organization Unit 部门 xdevops
/CN= Common Name 域名或IP gitlab.xdevops.cn
第四步:生成自签名SSL证书
# -days 证书有效期
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt

X.509证书包含三个文件:keycsrcrt

  • key是服务器上的私钥文件,用于对发送给客户端数据的加密,以及对从客户端接收到数据的解密
  • csr是证书签名请求文件,用于提交给证书颁发机构(CA)对证书签名
  • crt是由证书颁发机构(CA)签名后的证书,或者是开发者自签名的证书,包含证书持有人的信息,持有人的公钥,以及签署者的签名等信息

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

第五步:服务器配置
server {
        listen       10443 ssl;
        server_name  localhost;

        ssl_certificate      /home/docker/deploy/box/server.crt;
        ssl_certificate_key  /home/docker/deploy/box/server.key;

        ssl_session_cache    shared:SSL:1m;
        ssl_session_timeout  5m;

        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;

        client_max_body_size 1024m;         #主要是这个参数,限制了上传文件大大小
        client_body_buffer_size 2048k;

        location /server/ {
            proxy_pass http://agent-service;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }

        location /client/ {
            proxy_pass http://agent-service;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }

        location /api {
            add_header Access-Control-Allow-Origin *;
            proxy_pass http://gates;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
}