使用 OpenSSL 创建ssl自签名证书_openssl创建selfsign证书-程序员宅基地

技术标签: openssl  linux  

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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_50218044/article/details/123841672

智能推荐

文章详情页面评论功能添加及实现原理_在页面中输入你的评论,单击“评论”按钮,如果留言区没有评论,则直接添加评论,如果-程序员宅基地

文章浏览阅读9.9k次,点赞4次,收藏44次。1.评论框及评论内容展示模板如下: div id="comment"> h3>strong>发表评论:strong>h3> p>span>标题:span> input type="text" name="" id="comm_title" class="text">p> p>span>内容:span>textarea rows="10"_在页面中输入你的评论,单击“评论”按钮,如果留言区没有评论,则直接添加评论,如果

mitmdump 详解(3)-程序员宅基地

文章浏览阅读1.2k次。一 什么是mitmproxy 抓包工具2 mitmproxy抓包工具介绍pip install mitmproxy检测是否安装成功mitmproxy --version默认监听 8080端口,使用 -p 指定端口3 下载证书linux 中操作mitmproxytab 切换显..._mitm框架

JSTL中的<c:out>_jstl c:out输出有小数点-程序员宅基地

文章浏览阅读1.7k次。一般情况使用c:out和el表达式的效果是一样的,如: hello(使用标签):hello(使用el表达式):${hello}那一般什么时候会使用c:out标签呢?有两种情况: (1)使用缺省值。有的时候某个东西没设值,但要输出缺省值,如果用el表达式什么都不输出,但可以使用c:out输出想要输出的缺省值;如下: hello(default="123"):这样就输出了想要输出的_jstl c:out输出有小数点

jpa保存日期的数据与mysql实际保存时间有差异_jpa mysql 时间大小比较-程序员宅基地

文章浏览阅读261次。问题项目中数据库表对应实体类中包含Date类型的数据,保存Date类型数据时,传入的参数是new Date()(获取当前时间),但是在保存操作成功以后,在数据库中查看发现实际保存的时间比当前时间快解决最后发现是连接数据库的url中的时区参数是serverTimezone=UTC,把时区改成serverTimezone=GMT%2b8,问题解决..._jpa mysql 时间大小比较

Hotspot 性能架构 -转-程序员宅基地

文章浏览阅读103次。为什么80%的码农都做不了架构师?>>> ..._hotspot lir

hive使用适用场景_大数据入门:Hive应用场景-程序员宅基地

文章浏览阅读5.8k次。在大数据的发展当中,大数据技术生态的组件,也在不断地拓展开来,而其中的Hive组件,作为Hadoop的数据仓库工具,可以实现对Hadoop集群当中的大规模数据进行相应的数据处理。今天我们的大数据入门分享,就主要来讲讲,Hive应用场景。关于Hive,首先需要明确的一点就是,Hive并非数据库,Hive所提供的数据存储、查询和分析功能,本质上来说,并非传统数据库所提供的存储、查询、分析功能。Hive..._hive应用场景

随便推点

嵌入式固件加密的几种方式-程序员宅基地

文章浏览阅读669次,点赞13次,收藏8次。嵌入式固件加密的几种方式_固件加密

非root情况下访问手机存储位置权限的方法_不root 通讯录 存放目录-程序员宅基地

文章浏览阅读1.2k次。1.Manifest文件中申请读写外部的权限<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>2.高版本的需要动态申请权限int checkReadExternalPermission = checkSelfPermission(_不root 通讯录 存放目录

Mybatis项目开发流程_使用mybatis的开发步骤-程序员宅基地

文章浏览阅读502次。)创建成功之后在表中添加信息:项目创建完毕的初始目录:初始pom.xml文件:4.创建核心配置文件(mybatis-condig.xml)4.1 准备数据库配置文件(db.properties)4.2 配置mybatis-condig.xml5.建包这里需要注意:在resources资源包下创建的是directory,创建方式为:实体类的属性要和数据库里面表的字段相对应,数据类型采用包装类。7.创建Xxxmapper接口(mapper)接口中定义对数据库进行操作的方法:8_使用mybatis的开发步骤

三方协议,档案,工龄,保险,户口,-程序员宅基地

文章浏览阅读113次。1,三方协议:学校,个人,公司 ,三方的一个协议,作用 1,学校在统计就业率 会用到这个 凭证,2,国家为了让更多的毕业大学生找到工作(出发点很好)2,档案:一般会有三种状态,1,公司有权限管理,放在公司;2,放在 你工作城市的地方(有权限管理的地方,比如人力资源保障局什么玩意的)3,放在学校所在城市的地方(同上)4,打回原籍,你从那个山格拉里面出生的(当然也是一个有管理档案权限的地方,一般市..._职业学校三方协议 工龄

华为交换机命令 端口速率_华为S5700交换机的端口QOS限速问题-程序员宅基地

文章浏览阅读5.2k次,点赞2次,收藏15次。因为公司配置设备时没有购买网络行为管理,只有防火墙设备,但因为版本问题没法实现流量的管理这两天通telnet远程登陆至交换机,查看到相当多的下载、视频流量,因此想在交换机的相应端口进行速度的限制,结果出现了些小问题:根据华为的配置命令,输入如下:system-view[Quidway]inter gigabitethernet 0/0/1[Quidway -inter gigabitetherne..._华为s5720交换机对端口进行限速

目标检测简介-程序员宅基地

文章浏览阅读2.3k次。目标检测简介、评估标准、经典算法_目标检测