使用 OpenSSL 创建ssl自签名证书

本文详细介绍如何使用OpenSSL创建自签名SSL证书,包括创建过程、优缺点及应用场景,适合需要私有化部署SSL证书的场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近工作中需要创建私有化的ssl签名证书,以前使用的都是申请的免费的,没有了解过这方面的信息,经过查阅各种资料,加上数次测试,终于搞定了,一起来看看吧

什么是签名证书

自签名证书是未经公共或私有证书颁发机构签名的 SSL/TSL 证书。相反,它由创建者自己的个人或根 CA 证书签名。

这里借用一下大哥uncle的巨作,一篇文章了解数字证书

为了一个HTTPS,浏览器操碎了心

申请付费ssl证书流程

此处从https://devopscube.com/create-self-signed-certificates-openssl/借图

  1. 使用私钥创建 证书签名请求 (CSR) 。CSR 包含有关位置、组织和 FQDN(完全限定域名)的详细信息。
  2. 将 CSR 发送给受信任的 CA 机构。
  3. CA 机构将向您发送由其根证书机构和私钥签署的 SSL 证书。
  4. 然后,您可以验证 SSL 证书并将其用于您的应用程序。

创建自签名证书流程

 此处从https://devopscube.com/create-self-signed-certificates-openssl/借图

  1. 创建我们自己的根 CA 证书和 CA 私钥(我们自己充当 CA)
  2. 创建服务器私钥以生成 CSR
  3. 使用我们的根 CA 和 CA 私钥创建带有 CSR 的 SSL 证书。
  4. 在浏览器或操作系统中安装 CA 证书以避免安全警告。

使用 OpenSSL 创建自签名证书基本流程

  1. 搞一个虚拟的CA机构,生成一个证书
  2. 生成一个自己的密钥,然后填写证书认证申请,拿给上面的CA机构去签名
  3. 于是就得到了自(自建CA机构认证的)签名证书

1.创建一个目录openssl来保存所有生成的密钥和证书

mkdir openssl && cd openssl

2.创建rootCA.key 和 rootCA.crt。替换demo.mlopshub.com为自己的域名或 IP 地址。

openssl req -x509 \
            -sha256 -days 356 \
            -nodes \
            -newkey rsa:2048 \
            -subj "/CN=demo.mlopshub.com/C=US/L=San Fransisco" \
            -keyout rootCA.key -out rootCA.crt 

这里有可能报错:Can't load /home/vagrant/.rnd into RNG

解决办法:

cd /root
openssl rand -writerand .rnd

现在创建好的是所有设备上的 CA,也就是根CA,我们可以为任何需要 HTTPS 的新开发站点或者应用程序签署证书

创建服务端私钥

openssl genrsa -out server.key 2048

创建证书签名请求配置文件

/*
创建一个csr.conf文件以包含生成 CSR 的所有信息。替换127.0.0.1为自己的域名或 IP 地址
也可以不指定配置文件,直接生成的时候手动填写
这些问题的答案并不重要.他们在查看证书时出现.但是我们几乎不需要查看证书


证数各参数含义如下:

C-----国家(Country Name)
ST----省份(State or Province Name)
L----城市(Locality Name)
O----公司(Organization Name)
OU----部门(Organizational Unit Name)
CN----产品名(Common Name)
emailAddress----邮箱(Email Address)

req_distinguished_name :根据情况进行修改

alt_names: 127.0.0.1修改为 EMQ X 服务器实际的 IP 或 DNS 地址,例如:IP.1 = 127.0.0.1,或 DNS.1 = broker.xxx.com
*/

cat > csr.conf <<EOF
[ req ]
default_bits = 2048
prompt = no
default_md = sha256
req_extensions = req_ext
distinguished_name = dn

[ dn ]
C = US
ST = California
L = San Fransisco
O = MLopsHub
OU = MlopsHub Dev
CN = 127.0.0.1

[ req_ext ]
subjectAltName = @alt_names

[ alt_names ]
IP.1 = 127.0.0.1

EOF

使用服务器私钥生成证书签名请求 (CSR)

openssl req -new -key server.key -out server.csr -config csr.conf

现在我们的文件夹应该有三个文件。csr.conf,server.csrserver.key

使用根证书生成数字证书

1.创建配置文件

//127.0.0.1修改为 EMQ X 服务器实际的 IP 或 DNS 地址,例如:IP.1 = 127.0.0.1,或 
//DNS.1 = broker.xxx.com


cat > cert.conf <<EOF

authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names

[alt_names]
IP.1 = 127.0.0.1

EOF

2.使用自签名 CA 生成 SSL 证书

openssl x509 -req \
    -in server.csr \
    -CA rootCA.crt -CAkey rootCA.key \
    -CAcreateserial -out server.crt \
    -days 365 \
    -sha256 -extfile cert.conf

上面的命令将生成server.crt将与我们server.key一起用于在应用程序中启用 SSL

到此为止,根CA还有服务端数字证书和私钥就创建完毕了,当然也可以使用此根CA为多个客户端生成client.crt和client.key  这样的话如果客户端需要使用双向认证直接安装上就可以了

使用自签名证书有什么好处?

  1. 您无需依赖第三方来签署您的证书。
  2. 您可以创建和使用自己的证书颁发机构。
  3. 您不必为 CA 的证书付费。
  4. 您可以更好地控制您的证书。

使用自签名证书有什么缺点?

  1. 您的用户需要在他们的浏览器或应用程序中安装证书。
  2. 您的用户将需要手动信任您的证书颁发机构。
  3. 它们对于面向公众的应用程序不安全。
  4. 除非用户安装它们,否则所有浏览器或操作系统都不信任自签名证书。
  5. 容易受到中间人攻击。

什么是中间人攻击

如果你经常需要创建数字证书.也可以使用脚本

#! /bin/bash

if [ "$#" -ne 1 ]
then
  echo "Error: No domain name argument provided"
  echo "Usage: Provide a domain name as an argument"
  exit 1
fi

DOMAIN=$1

# Create root CA & Private key

openssl req -x509 \
            -sha256 -days 356 \
            -nodes \
            -newkey rsa:2048 \
            -subj "/CN=${DOMAIN}/C=US/L=San Fransisco" \
            -keyout rootCA.key -out rootCA.crt 

# Generate Private key 

openssl genrsa -out ${DOMAIN}.key 2048

# Create csf conf

cat > csr.conf <<EOF
[ req ]
default_bits = 2048
prompt = no
default_md = sha256
req_extensions = req_ext
distinguished_name = dn

[ dn ]
C = US
ST = California
L = San Fransisco
O = MLopsHub
OU = MlopsHub Dev
CN = ${DOMAIN}

[ req_ext ]
subjectAltName = @alt_names

[ alt_names ]
DNS.1 = ${DOMAIN}
DNS.2 = www.${DOMAIN}
IP.1 = 192.168.1.5 
IP.2 = 192.168.1.6

EOF

# create CSR request using private key

openssl req -new -key ${DOMAIN}.key -out ${DOMAIN}.csr -config csr.conf

# Create a external config file for the certificate

cat > cert.conf <<EOF

authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names

[alt_names]
DNS.1 = ${DOMAIN}

EOF

# Create SSl with self signed CA

openssl x509 -req \
    -in ${DOMAIN}.csr \
    -CA rootCA.crt -CAkey rootCA.key \
    -CAcreateserial -out ${DOMAIN}.crt \
    -days 365 \
    -sha256 -extfile cert.conf

通过执行以下命令设置脚本可执行权限。

chmod +x ssl.sh

使用域名或 IP 执行脚本。例如

./ssl.sh 127.0.0.1

附录

emqx开启ssl配置

/**
将serve.key 文件rootCA.crt文件及 serve.crt 文件拷贝到 EMQ X 的 etc/certs/ 目录下,并参考如下配置修改 emqx.conf:
emqx配置文件位置默认是:/emqx/etc/emqx.conf
*/

## listener.ssl.$name is the IP address and port that the MQTT/SSL
## Value: IP:Port | Port
listener.ssl.external = 8883

## Path to the file containing the user's private PEM-encoded key.
## Value: File
listener.ssl.external.keyfile = etc/certs/serve.key

## Path to a file containing the user certificate.
## Value: File
listener.ssl.external.certfile = etc/certs/serve.crt

## Path to the file containing PEM-encoded CA certificates. The CA certificates
## are used during server authentication and when building the client certificate chain.
##
## Value: File
listener.ssl.external.cacertfile = etc/certs/rootCA.crt

重启emqx之后就可以使用mqtt客户端链接工具测试链接

推荐使用emqx官方工具MQTTX

具体配置详情参考文档

EMQX SSL/TLS 使用配置指南

EMQX MQTT 服务器启用 SSL/TLS 安全连接

链接成功后可以在emqx dashboard中看到

当然,客户端链接的时候需要服务器对外暴露该端口

 好了,到这里就结束了,期间也是查阅了国内外各种文档,当然也有很多现成的写好的openssl生成证书教程.但是执行的时候总是这里错,那里错,还是自身知识储备量太少了,索性把自己试过,可行的方式记录下来.有如果有看不懂的地方,欢迎在评论区区交流.我是路北.我为自己带盐.

参考文献

1.How to Create Self-Signed Certificates using OpenSSL

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值