• 使用OpenSSL生成自签证书


    什么是OpenSSL

    OpenSSL是一个开源的软件库和工具套件,用于安全地处理网络数据传输中的加密、解密、安全套接层(SSL)以及传输层安全(TLS)协议等功能。它广泛应用于网站和互联网服务中,以确保数据传输的安全性和隐私性。OpenSSL可以运行在多种操作系统上,并为程序员提供了用C、C++、Python等语言编写的应用程序接口(API)。官网:https://www.openssl.org/

    安装OpenSSL

    参考:https://www.feistyduck.com/library/openssl-cookbook/online/openssl-command-line/building-openssl.html

    使用OpenSSL生成自签证书

    创建ca根证书及其私钥

    ca证书及其私钥是后续创建其他证书的前提,相当于其他证书是经过ca证书认证后颁发的。

    分2步:

    创建ca私钥

    openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:2048 -out ca_private_key.pem
    
    • 1

    用私钥创建ca根证书

    openssl req -x509 -days 3650 -new -key ca_private_key.pem -subj "/CN=kubernetes" -out ca_root_certificate.pem
    
    • 1

    根据CA根证书及其私钥生成自签名证书

    生成服务器(或客户端)私钥

    openssl genpkey -algorithm RSA -out server_private_key.pem -pkeyopt rsa_keygen_bits:2048
    
    • 1

    创建服务器证书签名请求(CSR)

    openssl req -new -key server_private_key.pem -subj "/CN=www.zptest.com/C=CN/L=ShenZhen/ST=GuangDong" -out server_csr.pem
    
    • 1

    注意:-subj的格式:/type0=value0/type1=value1/type2=…

    例如:-subj "/CN=www.zptest.com/C=CN/L=ShenZhen/ST=GuangDong"

    或者如下用配置文件代替命令行-subj "/CN=www.zptest.com"的方式:

    • step1:先创建csr配置文件:csr.conf;
    • step2:再使用-config选项创建csr

    如下:

    # step1
    cat > csr.conf <<EOF
    [ req ]
    default_bits = 2048
    prompt = no
    default_md = sha256
    req_extensions = req_ext
    distinguished_name = dn
    
    [ dn ]
    C = CN
    ST = GuangDong
    L = ShenZhen
    CN = www.zptest.com
    
    [ req_ext ]
    subjectAltName = @alt_names
    
    [ alt_names ]
    IP.1 = 127.0.0.1
    EOF
    
    # step2
    openssl req -new -key server_private_key.pem -out server_csr.pem -config csr.conf
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    使用ca根证书签发服务器(或客户端)证书

    openssl x509 -req -days 365 -in server_csr.pem -CA ca_root_certificate.pem -CAkey ca_private_key.pem -set_serial 01 -out server_certificate.pem
    
    • 1

    -set_serial 01:选项是为证书分配的唯一表示标识号,类似于身份证。值类型可以为十进制或者十六进制(通过前缀加0x)。每个X.509证书的序列号必须唯一,以便在需要时轻松确定、追踪和管理特定证书。例如,在撤销证书时,可以使用序列号查询或标记证书已撤销

    可以通过如下方式查询到证书的序列号:

    openssl x509 -in server_certificate.pem -noout -text | grep -i "Serial Number"
    
    • 1

    验证服务器(或客户端)证书

    openssl verify -CAfile ca_root_certificate.pem server_certificate.pem
    
    • 1

    输出server_certificate.pem: OK则表明证书验证成功。

    补充:

    查看证书的详细信息:

    [root@k8s-master openssl_test]# openssl x509 -noout -text -in  server_certificate.pem
    Certificate:
        Data:
            Version: 1 (0x0)
            Serial Number: 1 (0x1)
        Signature Algorithm: sha256WithRSAEncryption
            Issuer: CN=kubernetes
            Validity
                Not Before: Oct 11 07:03:51 2023 GMT
                Not After : Oct 10 07:03:51 2024 GMT
            Subject: C=CN, ST=GuangDong, L=ShenZhen, CN=www.zptest.com
            Subject Public Key Info:
                Public Key Algorithm: rsaEncryption
                    Public-Key: (2048 bit)
                    Modulus:
                        00:a1:36
    ……
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    总结

    1. 创建自签名证书需要先创建一个“自认权威”的ca,充当第三方CA的角色。这就涉及到创建ca私钥和创建ca根证书

    2. 通过证书签名请求中的-subj来指定证书绑定哪个(哪些)域名

    3. 使用证书时,域名要和证书中的域名对应上

    4. 使用curl访问域名时,要手动指定ca证书来进行校验,通过--cacert选项来指定

      比如:

      [root@k8s-master cfssl_test]# curl -L www.zptest.com/index.html --cacert ca.pem
      hello nginx
      
      • 1
      • 2

    知识补充

    openssl中genpkey和genrsa命令有啥区别?

    genrsagenpkey命令都可以在OpenSSL中生成RSA私钥,但二者之间存在一些区别:

    1. 可生成的密钥类型:
    • genrsa命令仅用于生成RSA私钥。
    • genpkey更通用,可以生成不仅仅是RSA类型的私钥,还可以生成其他如DSA、EC(Elliptic Curve)等多种类型的私钥。
    1. 算法参数和选项:
    • genrsa只支持一部分RSA相关的选项。
    • genpkey支持各种密钥类型的全部参数和选项,并拥有更多的灵活性。

    OpenSSL版本:

    • genrsa命令在早期的OpenSSL版本已经存在,所以对于使用较旧版本的OpenSSL的用户来说,genrsa可能是更常用的命令。
    • genpkey命令在OpenSSL中引入较晚,但由于其通用性和灵活性,现在被官方推荐使用,尤其在生成非RSA密钥时。

    总结:尽管genrsagenpkey都可以生成RSA私钥,但genpkey命令更为通用且灵活,适用于生成各种密钥类型。因此,建议在现代应用中使用genpkey命令生成私钥

    附录

    OpenSSL官网

    OpenSSL cookbook

  • 相关阅读:
    Redis字符串、hash、列表方法使用以及Redis管道与Django集成Redis
    Pytorch学习:torch.randn()
    NLP中常用的utils
    网页设计学习记录-常用圆角按钮css
    【我的Android进阶之旅】在Android中使用MediaPipe库在实时视频源上实现人脸网格Face Mesh的绘制
    1.Vue—简介、实例与容器、MVVM模型
    Java数组详解
    Python学习从0开始——项目一day02数据库连接
    计算机毕业设计Java毕业生就业管理系统(源码+系统+mysql数据库+lw文档)
    BBR/CUBIC 共存时的 buffer 挤兑
  • 原文地址:https://blog.csdn.net/zpsimon/article/details/133804745