使用openssl生成X.509v3版https自签名证书

一键生成自签名证书脚本-方法一

  • 脚本内容

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    #!/bin/sh

    printf "[req]
    default_bits = 4096
    default_md = sha256
    prompt = no
    encrypt_key = no
    string_mask = utf8only

    distinguished_name = cert_distinguished_name
    req_extensions = req_x509v3_extensions

    # 将下面的信息替换成你的信息
    [ cert_distinguished_name ]
    C = CN
    ST = GD
    L = GZ
    O = fullstackmemo
    OU = fullstackmemo
    CN = fullstackmemo.com

    [req_x509v3_extensions]
    basicConstraints = critical,CA:true
    subjectKeyIdentifier = hash
    authorityKeyIdentifier = keyid:always,issuer
    keyUsage = critical,digitalSignature,keyCertSign,cRLSign #,keyEncipherment
    extendedKeyUsage = critical,serverAuth #, clientAuth
    [email protected]_names

    # 将下面的信息替换成你的信息, 如果无需绑定域名或IP, 可以将其多余删除
    [alt_names]
    DNS.1 = *.fullstackmemo.com
    IP.1 = 192.168.216.30
    IP.2 = 127.0.0.1

    " >ca_cert.conf

    # 生成证书和key的对应文件名
    key_file=server-key.pem
    cert_file=server-cert.pem

    openssl ecparam -out $key_file -name prime256v1 -genkey
    openssl req -new -sha256 -x509 -days 7300 -config ca_cert.conf -extensions req_x509v3_extensions -key $key_file -out $cert_file
    openssl x509 -in $cert_file -serial -noout
    openssl x509 -noout -text -in "server-cert.pem"
    echo -e "\e[1m\e[34m基于openssl verify校验证书可用性:\e[0m"
    # 返回ok字样代表自签名证书是有效的.
    openssl verify -verbose -CAfile $cert_file $cert_file

    echo -e "\e[1m\e[34m基于openssl s_server校验证书可用性:\e[0m"
    openssl s_server -cert $cert_file -key $key_file -CAfile $cert_file -Verify 3 -accept 4430 -www &
    openssl_pid=$!
    # 测试证书有效性, 127.0.0.1可以改成alt_names中你想测试的域名或IP, 前提是被测试的域名需要被正确解析到本机.
    # 返回Verify return code: 0 (ok)代表自签名证书是有效的.
    echo 'GET /HTTP/1.1' | openssl s_client -connect 127.0.0.1:4430 -cert $cert_file -key $key_file -CAfile $cert_file
    kill ${openssl_pid}
  • 脚本使用方法

    1
    2
    3
    4
    5
    # 将以上脚本内容需要修改部分修改后复制到/tmp/cert/self_signed.sh
    chmod 755 /tmp/cert/self_signed.sh

    # 运行此命令后在/tmp/cert下即可看到"server-cert.pem"和"server-key.pem"文件
    /tmp/cert/self_signed.sh

命令方式生成基于CA中心的自签名证书-方法二

  • openssl.cnf

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    [req]
    default_bits = 4096
    default_md = sha256
    prompt = no
    encrypt_key = no
    string_mask = utf8only

    distinguished_name = cert_distinguished_name
    req_extensions = req_x509v3_extensions

    # 将下面的信息替换成你的信息
    [ cert_distinguished_name ]
    C = CN
    ST = GD
    L = GZ
    O = fullstackmemo
    OU = fullstackmemo
    CN = fullstackmemo.com

    [req_x509v3_extensions]
    basicConstraints = critical,CA:true
    subjectKeyIdentifier = hash
    # authorityKeyIdentifier = keyid:always,issuer
    keyUsage = critical,digitalSignature,cRLSign #,keyEncipherment
    extendedKeyUsage = critical,serverAuth #, clientAuth
    [email protected]_names

    # 将下面的信息替换成你的信息, 如果无需绑定域名或IP, 可以将其多余删除
    [alt_names]
    DNS.1 = *.fullstackmemo.com
    IP.1 = 192.168.216.30
    IP.2 = 127.0.0.1
  • 执行命令

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    mkdir -p /tmp/keys/private
    cd /tmp/keys
    # 将以上openssl.cnf内容保存到此目录下且文件名为openssl.cnf
    # 生成秘钥
    openssl genrsa -out root.key 4096
    # 生成根证书签发申请文件, -subj部分需要修改成自己的内容
    openssl req -new -key root.key -out root.csr -subj "/C=CN/ST=GD/L=SZ/O=fullstackmemo/OU=fullstackmemo/CN=fullstackmemo.com"
    # 自签发证书
    openssl x509 -req -days 7300 -sha256 -extensions req_x509v3_extensions -signkey root.key -in root.csr -out root.cer
    # 生成服务端私钥
    openssl genrsa -out private/server-key.pem 4096
    # 生成证书请求文件
    openssl req -new -key private/server-key.pem -config openssl.cnf -extensions req_x509v3_extensions -out private/server.csr
    # 使用根证书签发服务端证书(此时证书只有公钥,没有私钥)
    openssl x509 -req -days 7300 -sha256 -extfile openssl.cnf -extensions req_x509v3_extensions -CA root.cer -CAkey root.key -CAserial ca.srl -CAcreateserial -in private/server.csr -out private/server-cert.pem
    # 验证证书有效性, 如果返回ok, 代表初步验证通过
    openssl verify -verbose -CAfile root.cer private/server-cert.pem
    # 调用服务模式进行证书验证, 输入这行命令后要手动按一下回车键
    openssl s_server -cert private/server-cert.pem -key private/server-key.pem -CAfile root.cer -Verify 3 -accept 4430 -www &
    openssl_pid=$!
    # 此行返回Verify return code: 0 (ok)代表验证通过
    echo 'GET /HTTP/1.1' | openssl s_client -connect 127.0.0.1:4430 -cert private/server-cert.pem -key private/server-key.pem -CAfile root.cer
    # 关闭测试用的opessl服务
    kill ${openssl_pid}
    # 在/tmp/keys/private下即可看到"server-cert.pem"和"server-key.pem"文件

Chrome常见报错

  • NET::ERR_CERT_INVALID
    1. 使用openssl req命令来生成server.csr文件的时没配置openssl.cnf文件且没有带上-config openssl.cnf
    2. openssl.cnf中指定了keyUsage但是没带keyCertSign
  • NET::ERR_CERT_AUTHORITY_INVALID
    • Windows-Chrome
      1. server-cert.pem下载到客户电脑上, 改名为server-cert.cer且双击此文件
      2. 点击安装证书->当前用户->将所有的证书放入下列存储->浏览->受信任的根证书颁发机构->确定->下一步->完成->确定->确定
      3. 重启Chrome浏览器, 再次访问即可, 也可以直接在浏览器中输入chrome://restart来重启Chrome浏览器
    • macOS-Chrome
      1. server-cert.pem下载到客户电脑上, 改名为server-cert.cer
      2. 参考Windows方式自行谷歌百度, 关键词: macOS 导入cer证书
    • Firefox
      1. 在警告页,点击高级->添加例外->确认安全例外

FireFox常见报错

  • 您的连接并不安全-该证书因为其自签名而不被信任
    1. 在警告页,点击高级->添加例外->确认安全例外

参考

WeDemo生成密钥与自签名证书指南
通过使用不受信任的证书配置 SSL
配置浏览器以使用自签名证书
STANDARD X.509 V3 CERTIFICATE EXTENSION REFERENCE

显示 Gitment 评论