最近工作中需要创建私有化的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.1EOF

使用服务器私钥生成证书签名请求 (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.comcat > cert.conf <<EOFauthorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names[alt_names]
IP.1 = 127.0.0.1EOF

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/bashif [ "$#" -ne 1 ]
thenecho "Error: No domain name argument provided"echo "Usage: Provide a domain name as an argument"exit 1
fiDOMAIN=$1# Create root CA & Private keyopenssl 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 confcat > 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.6EOF# create CSR request using private keyopenssl req -new -key ${DOMAIN}.key -out ${DOMAIN}.csr -config csr.conf# Create a external config file for the certificatecat > cert.conf <<EOFauthorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names[alt_names]
DNS.1 = ${DOMAIN}EOF# Create SSl with self signed CAopenssl 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

使用 OpenSSL 创建ssl自签名证书相关推荐

  1. OpenSSL创建的自签名证书在chrome端无法信任

    文章目录 问题描述 原因概述 解决方案 修改待用的openssl配置文件 创建证书 对tomcat配置证书(适用于Tomcat 8.5) 问题描述 ArcGIS Enterprise环境下往往需要创建 ...

  2. java ssl证书_Java安全教程–创建SSL连接和证书的分步指南

    java ssl证书 在有关应用JEE安全性的系列文章中,我们为您提供了另一个有关如何在Java EE应用程序中创建SSL连接和创建证书的详细教程. 如我们之前的文章中所述, 安全套接字层(SSL)/ ...

  3. Java安全教程–创建SSL连接和证书的分步指南

    在有关应用JEE安全性的系列文章中,我们为您提供了另一个有关如何在Java EE应用程序中创建SSL连接和创建证书的详细教程. 如我们之前的文章中所述, 安全套接字层(SSL)/传输层安全性(TLS) ...

  4. 英文文档: 如何使用 OpenSSL 创建与吊销数字证书

    推荐一篇文档, 讲解如何使用 OpenSSL 创建与吊销数字证书: https://www.linux.com/BLOG/PKI-IMPLEMENTATION-LINUX-ADMIN

  5. openssl创建CA、申请证书及其给web服务颁发证书

    一.创建私有的CA   1)查看openssl的配置文件:/etc/pki/tls/openssl.cnf   2)创建所需的文件 touch /etc/pki/CA/index.txt   echo ...

  6. 生成SSL自签名证书

    自签名证书浏览器是不认可的,但学习一下还是很有必要的. 创建SSL证书私钥,期间需要输入两次用户名和密码,证书名称命名为c.key openssl genrsa -des3 -out c.key 20 ...

  7. OPENSSL生成SSL自签证书

    OPENSSL生成SSL自签证书 目前,有许多重要的公网可以访问的网站系统(如网银系统)都在使用自签SSL证书,即自建PKI系统颁发的SSL证书,而不是部署支持浏览器的SSL证书. 支持浏览器的SSL ...

  8. openssl创建CA并签发证书

    一.创建私有CA根证书 1.创建CA目录 root@DESKTOP-JP3S3AN:/home/wsl/openssl_pro# mkdir -pv /etc/pki/CA/{private,cert ...

  9. 使用java实现rfc3161,openssl验证用自签名证书签名的RFC3161时间戳

    我使用openssl从rfc 3161 timestampreq生成了一个rfc3161 timestampresp. 因此,我使用了自签名CA证书和自签名CA使用以下命令颁发的TSA证书: open ...

  10. nginx配置https访问 生成ssl自签名证书,浏览器直接访问

    问题 nginx配置自签名ssl证书,来支持https访问nginx,在浏览器中访问nginx时,提示有风险.而访问其他各大网站时,也是使用了https协议,为什么可以直接访问,而不提示有风险呢? 解 ...

最新文章

  1. linux 565显示格式,RGB565转BMP格式 C语言程序
  2. 谷歌地图API位置请求_Google Maps API
  3. oracle常用函数归纳
  4. python保存两位小数的几种方法,python2保留小数
  5. 常考数据结构与算法:子数组中的最大累加和问题
  6. 教师编学科知识计算机,教师考试信息技术学科知识考什么_谈信息技术学科教师应该怎样教学...
  7. JAVA线程的interrupt
  8. 检查一列数据的重复项 vba_提取重复值,但字典不是重点。
  9. python小仙女_python——time库整理(基础知识+实例)
  10. mysql hex 和 c_什么是MySQL HEX()函数,它与CONV()函数有何不同?
  11. 零距离泛目录站群开源版源码
  12. linux系统在硬盘上安装程序,怎么样用硬盘上的镜象文件来安装Linux系统?我都进入安装界面了,但是那个安装程序好像找不到那几个镜象文件,请指点...
  13. 95-872-064-源码-CEP-CepOperator源码
  14. paip.c++ qt creator svn 设置以及使用总结.
  15. Oracle12c错误01017,ORACLE12.2中用户无法登陆报ORA-01017的解决办法
  16. 虚幻引擎3命令行参数
  17. 第一章:Python数据分析前的基础铺垫
  18. AR涂涂乐⭐七、(end)取消“识别成功”提示面片、加入太阳系及其交互功能、退出按钮设置
  19. 常见的加密方式之python实现
  20. 产业区块链一周动态丨江西将出台区块链五年计划,数字货币试点引发A股躁动...

热门文章

  1. 机器学习--红酒质量检测分析(包含数据集,直接可用)
  2. 移动中兴服务器地址,一中国移动宽带各地dns服务器地址.doc
  3. 2014 Unity 璀璨星空夜
  4. 当游戏设计遇上建筑学
  5. 各代iphone尺寸_历代iPhone机身厚度对比: 6代最薄, iPhone X 难进前五
  6. 球面坐标系与指标坐标系转换
  7. BAT大牛亲授从零起步基于ElasticSearch的搜房网(前后端集成)实战(第二章需求分析和数据库设计)
  8. 澳洲CE毕业意向FullStackDeveloper
  9. python-更新word目录
  10. 分布式数据库中间件对比总结 数据库(分库分表)中间件对比