openssl创建CA证书教程

news2025/1/10 17:41:15

配置生成CA证书

总示意图:

(1),通过openssl创建CA证书

  • 第一步:创建一个秘钥,这个便是CA证书的根本,之后所有的东西都来自这个秘钥
# 通过rsa算法生成2048位长度的秘钥
openssl genrsa -out myCA.key 2048
  • 第二步:是通过秘钥加密机构信息形成公钥
# 公钥包含了机构信息,在输入下面的指令之后会有一系列的信息输入,
# 这些信息便是机构信息,公司名称地址什么的
# 这里还有一个过期信息,CA证书也会过期,openssl默认是一个月,这里设置为10年
openssl req -new -x509 -key myCA.key -out myCA.cer -days 3650

执行命令过程如下图所示:

参数名称

参数值

Country Name

国家代码,比如中国就是CN

State or Province Name

省名称

Locality Name

城市名称

Organization Name

机构名称

Organizational Unit Name

机构单位名称

Common Name

重点参数:授权给什么,因为机构是根节点所以是授权给自己

Email Address

邮件地址

(2),创建服务器证书

在得到CA证书之后,需要通过 openssl工具对证书进行转换得到公钥( .crt文件)和密钥( .key文件),无论CA证书是怎么来的到这里之后就没有任何区别了,服务器证书的制作流程相较CA证书要复杂一点点。

第一步:通过openssl工具创建服务器的秘钥

# 通过RSA算法生成长度2048位的秘钥
openssl genrsa -out server.key 2048

第二步:创建签名请求

首先 https证书的公钥不同于自定义情况下的加密证书,这里需要安装浏览器标准进行配置,首先 openssl默认的证书版本是V1,V1在支持 https时部分浏览器依旧会认为不安全,所以需要使用V3版本;同时 openssl即便是使用V3版本依旧没有附带V3的 subjectAltName字段数据(这里是证书对应的IP地址或者域名,可以用通配符)。但是这些东西命令行没法指定所以需要配置文件,我这里准备了一个:
创建 openssl.cnf 文件,并添加如下内容:
tsa_policy2 = 1.2.3.4.5.6
tsa_policy3 = 1.2.3.4.5.7
[ ca ]
default_ca = CA_default  # The default ca section
[ CA_default ]
dir  = ./demoCA  # Where everything is kept
certs  = $dir/certs  # Where the issued certs are kept
crl_dir  = $dir/crl  # Where the issued crl are kept
database = $dir/index.txt # database index file.
new_certs_dir = $dir/newcerts  # default place for new certs.
certificate = $dir/cacert.pem  # The CA certificate
serial  = $dir/serial   # The current serial number
crlnumber = $dir/crlnumber # the current crl number
crl  = $dir/crl.pem   # The current CRL
private_key = $dir/private/cakey.pem# The private key
RANDFILE = $dir/private/.rand # private random number file
x509_extensions = usr_cert  # The extentions to add to the cert
name_opt  = ca_default  # Subject Name options
cert_opt  = ca_default  # Certificate field options
default_days = 365   # how long to certify for
default_crl_days= 30   # how long before next CRL
default_md = default  # use public key default MD
preserve = no   # keep passed DN ordering
policy  = policy_match
[ policy_match ]
countryName  = match
stateOrProvinceName = match
organizationName = match
organizationalUnitName = optional
commonName  = supplied
emailAddress  = optional
[ policy_anything ]
countryName  = optional
stateOrProvinceName = optional
localityName  = optional
organizationName = optional
organizationalUnitName = optional
commonName  = supplied
emailAddress  = optional
[ req ]
default_bits  = 1024
default_keyfile  = privkey.pem
distinguished_name = req_distinguished_name
attributes  = req_attributes
x509_extensions = v3_ca # The extentions to add to the self signed cert
string_mask = utf8only
req_extensions = v3_req # The extensions to add to a certificate request
[ req_distinguished_name ]
countryName   = Country Name (2 letter code)
countryName_default  = CN
countryName_min   = 2
countryName_max   = 2
stateOrProvinceName  = State or Province Name (full name)
stateOrProvinceName_default = BeiJing
localityName   = Locality Name (eg, city)
0.organizationName  = Organization Name (eg, company)
0.organizationName_default = myca
organizationalUnitName  = Organizational Unit Name (eg, section)
commonName   = Common Name (e.g. server FQDN or YOUR name)
commonName_max   = 64
emailAddress   = Email Address
emailAddress_max  = 64
[ req_attributes ]
challengePassword  = A challenge password
challengePassword_min  = 4
challengePassword_max  = 20
unstructuredName  = An optional company name
[ usr_cert ]
basicConstraints=CA:FALSE
nsCertType = client, email, objsign
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
nsComment   = "OpenSSL Generated Certificate"
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid,issuer
[ svr_cert ]
basicConstraints=CA:FALSE
nsCertType   = server
keyUsage = nonRepudiation, digitalSignature, keyEncipherment, dataEncipherment, keyAgreement
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid,issuer
extendedKeyUsage = serverAuth,clientAuth
[ v3_req ]
subjectAltName = @alt_names
# 这里是重点,需要将里面配置为最终服务端需要的域名或者IP
# 这里可以写多个,能够自行添加DNS.X = XXXXXX, 支持通配符
[ alt_names ]
DNS.1 = www.k8s-harbor.com
DNS.2 = k8s-harbor.com
[ v3_ca ]
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid:always,issuer
basicConstraints = CA:true
[ crl_ext ]
authorityKeyIdentifier=keyid:always
[ proxy_cert_ext ]
basicConstraints=CA:FALSE
nsComment   = "OpenSSL Generated Certificate"
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid,issuer
proxyCertInfo=critical,language:id-ppl-anyLanguage,pathlen:3,policy:foo
[ tsa ]
default_tsa = tsa_config1 # the default TSA section
[ tsa_config1 ]
dir  = ./demoCA  # TSA root directory
serial  = $dir/tsaserial # The current serial number (mandatory)
crypto_device = builtin  # OpenSSL engine to use for signing
signer_cert = $dir/tsacert.pem  # The TSA signing certificate
     # (optional)
certs  = $dir/cacert.pem # Certificate chain to include in reply
     # (optional)
signer_key = $dir/private/tsakey.pem # The TSA private key (optional)
default_policy = tsa_policy1  # Policy if request did not specify it
     # (optional)
other_policies = tsa_policy2, tsa_policy3 # acceptable policies (optional)
digests  = md5, sha1  # Acceptable message digests (mandatory)
accuracy = secs:1, millisecs:500, microsecs:100 # (optional)
clock_precision_digits  = 0 # number of digits after dot. (optional)
ordering  = yes # Is ordering defined for timestamps?
    # (optional, default: no)
tsa_name  = yes # Must the TSA name be included in the reply?
    # (optional, default: no)
ess_cert_id_chain = no # Must the ESS cert id chain be included?
    # (optional, default: no)

将上面的配置内容保存为openssl.cnf放到生成的服务器证书文件的目录下(注意:修改alt_names里面的域名或者IP为最终部署需要的地址,支持通配符),然后执行创建签名申请文件即可,执行运行:

注意:在 openssl.conf中一定要加有关的域名,然后生成对应服务器的证书的时候也使用域名就可以实现正常的访问了。
# 和创建CA时一样这里需要输入一堆服务器信息,输入项也是相同的。
# 不过在输入Common Name(CN)最好直接输入服务器的IP地址或者域名。
openssl req -config openssl.cnf -new -out server.req -key server.key 

执行命令过程如下图所示:

第三步:通过CA机构证书对服务器证书进行签名认证

这里服务器的公钥是由CA证书的密钥配对加密来的。
# 这里本质上就是将签名请求文件进行签名最终得到服务器的公钥
openssl x509 -req \
-extfile openssl.cnf \
-extensions v3_req \
-CAkey myCA.key \
-CA myCA.cer \
-days 3650 \
-in server.req \
-out server.cer \
-CAcreateserial -CAserial serial

cer证书转成crt证书

命令如下:

openssl x509 -inform PEM -in server.cer -out server.crt

crt证书转成cert证书

命令如下:

openssl x509 -inform PEM -in server.crt -out server.cert

cer证书转换为jks证书:

# 方法一:
keytool -import \
-alias certificate_alias \
-file server.cer \
-keystore server.jks

# 方法二:
# 1. 将cer证书转换为PKCS12格式的证书
keytool -importcert \
-file server.cer \
-keystore server.p12 \
-storetype PKCS12

# 2. 将PKCS12格式的证书转换为JKS格式的证书
keytool -importkeystore \
-destkeystore server.jks \
-srckeystore server.p12 \
-srcstoretype pkcs12 \
-alias alias_name  # 无 alias 则不加此参数

信任CA机构证书

通过openssl创建的CA证书,只需要将CA证书的公钥(myCA.cer文件)导入到系统信任的根证书颁发机构里面就行了,即直接双击cer文件进行证书安装,最终不光是windows系统,任何操作系统都可以安装证书来进行对CA机构的进行信任操作。

  • 第一步:双击证书,点击【安装证书】;
  • 第二步:选择【本地计算机】,根据提示选择【是】;
  • 第三步:选择【将所有的证书都放入下列存储】,并点击【浏览(R)】;
  • 第四步:选择【受信任的根证书颁发机构】,并点击【确定】;
  • 第五步:选择【下一页(N)】,紧接着点【完成】。

或者,通过chrome 浏览器添加证书(use):

打开 "设置" --》 "隐私和安全" --》"安全" --》“管理设备证书”--》"受信任的根证书颁发机构" --》"导入",最终导入 myCA.cer 证书文件即可。
导入成功后,可在 "受信任的根证书颁发机构"列表查看到该证书。

为 harbor 和 docker 颁发证书

(1) 将服务端证书拷贝至 /data/cert/目录下

mkdir -p /data/cert/
cp server.crt /data/cert/
cp server.key /data/cert/

(2) 将 server.crt 文件拷贝到docker的证书目录下,注意替换为自己的域名

mkdir -p /etc/docker/certs.d/www.k8s-harbor.com/
cp server.crt /etc/docker/certs.d/www.k8s-harbor.com/

这里需要注意的是,如果nginx中对https没有使用默认的443端口,修改为其他端口了,则此时的需要创建的目录为:/etc/docker/certs.d/yourdomain.com:port, 或者 /etc/docker/certs.d/harbor_IP:port

(3) 重启docker

systemctl restart docker

修改 harbor.yml 配置文件

修改harbor.yml配置 (位于/usr/local/harbor),开启 https 配置。

如下前面部署 http 模式的时候将https的部分注释了,这里要将 https 的配置放开注释,而且修改证书的文件路径,如下所示
# Configuration file of Harbor

# The IP address or hostname to access admin UI and registry service.
# DO NOT use localhost or 127.0.0.1, because Harbor needs to be accessed by external clients.
hostname: harbor.ninexch.com #更改为本地解析IP的域名

# http related config
http:
  # port for http, default is 80. If https enabled, this port will redirect to https port
  port: 80
# https related config
https: #开启Https
  # https port for harbor, default is 443
  port: 443 #开启端口
  # The path of cert and key files for nginx
  certificate: /data/cert/server.crt #指定SSL公有证书
  private_key: /data/cert/server.key #指定SSL私有证书

然后执行如下命令更新 harbor

# 重新安装(harbor相关容器会被删除,数据正常不会丢失)
./install.sh

# 重新编译配置文件(数据会丢失) -- no use
./prepare
docker-compose down -v
docker-compose up -d

Nginx 配置 https

修改 nginx.conf 配置,增加监听 443 端口的,跳转到harbor的8443端口,此外在这里需要指定证书文件的路径

server {
    listen 443 ssl;
    server_name www.k8s-harbor.com;
     
    ssl_certificate /data/cert/server.crt;
    ssl_certificate_key /data/cert/server.key;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
     
    ssl_session_cache shared:SSL:1m;
    ssl_session_timeout 5m;
 
    location / {
        client_max_body_size 1024M;
        client_body_buffer_size 1024M;
        proxy_redirect off;
        proxy_pass https://172.22.27.162:8443;
         
        proxy_set_header Host $host;
         
        proxy_set_header X-Real-IP $remote_addr;
         
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
     
    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
        root html;
    }
}

然后将 http 的跳转到 https

server {
    listen 80;
    server_name www.k8s-harbor.com;
    return 301 https://www.k8s-harbor.com$request_uri;
}

然后重新加载配置文件

nginx -s reload
此时在浏览器就可以 通过 http://www.k8s-harbor.com 和 https://www.k8s-harbor.com 访问,当使用 http://www.k8s-harbor.com 时会发现自动跳转到 https://www.k8s-harbor.com

Nginx 配置可能遇到额问题

注意,如果出现类似如下错误:

nginx: [emerg] unknown directive "ssl_certificate" in /usr/local/nginx/conf/nginx.conf

或者类似如下错误;

error: SSL modules require the OpenSSL library.

说明 nginx 没有安装ssl,此时进入nginx的源码目录,执行如下命令

./configure \
--prefix=/usr/local/nginx \
--with-http_stub_status_module \
--with-http_ssl_module \
--with-openssl=/usr/local/src/openssl-1.1.1o

其中:

  • /usr/local/src/openssl-1.1.1o 目录 为openssl 源码包的解压目录

然后使用 make 编译,注意,不要使用 make install,否则会覆盖

make

然后备份原有的nginx 命令,并将新编译的nginx拷贝的nginx命令所在的目录

# 将原有的命令重命名备份
mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.bark

# 将新编译的nginx命令拷贝到nginx命令的目录下
cp objs/nginx /usr/local/nginx/sbin/

然后执行 nginx -V ,如下,出现 —with-http_ssl_module 表示安装成功

[root@redrose2100 nginx-1.21.4]# nginx -V
nginx version: nginx/1.21.4
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC)
built with OpenSSL 1.1.1o 3 May 2022
TLS SNI support enabled
configure arguments: --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-openssl=/usr/local/src/openssl-1.1.1o
[root@redrose2100 nginx-1.21.4]#

然后再次执行如下命令重新加载nginx配置

nginx -s reload

原理简介

(1),有一个CA机构

只有CA机构的公钥证书被安装在受信任的根证书颁发机构,才能达到将做到让系统信任。
  • 第一步:需要创建一个密钥文件(myCA.key);
  • 第二步:根据这个创建出一个公钥文件(myCA.cer)。
    经过如上两步操作之后,我们就自定义了一个CA证书,意味着我们有了一个CA机构。

(2),再自定义生成一个证书文件,并通过CA机构进行签名

  • 第一步:创建一个密钥文件(server.key);
  • 第二步:创建一个签名请求的配置文件(openssl.cnf);
  • 第三步:根据配置文件,创建出一个签名的请求,也会生成一个文件(server.req);
  • 第四步:通过CA机构对我们的密钥文件(server.crt) 和 签名请求(server.req) 一起来生成自定义的公钥证书(server.cer)
  • 第五步:如果需要,也可以将.cer文件转成.crt文件;
  • 第六步:就是将证书通过Nginx代理;

(3),最后,将CA结构添加到访问者的受信任区

因为我们自定义的CA机构一定不再请求的信任区内的,所以我们需要手动添加一下才可以。

参考连接

1, 局域网内搭建浏览器可信任的SSL证书
2, 将cer格式的证书转为crt格式
3, 生成可信任的https证书 - 简书

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1030731.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Wireshark TS | MQ 传输缓慢问题

问题背景 应用传输慢是一种比较常见的问题,慢在哪,为什么慢,有时候光从网络数据包分析方面很难回答的一清二楚,毕竟不同的技术方向专业性太强,全栈大佬只能仰望,而我们能做到的是在专注于自身的专业方向之…

什么是Selenium?使用Selenium进行自动化测试!

你知道什么是 Selenium 吗?你知道为什么要使用它吗?答案就在本文中,很高兴能够与你共飧。 自动化测试正席卷全球,Selenium 认证是业界最抢手的技能之一。 什么是 Selenium? Selenium 是一种开源工具,用于…

Spring Cloud Alibaba Nacos 2.2.3 (2) - 单机版启动 (winodows 和 linux )

Nacos 2.2.3 (1) - 下载与数据库配置 参考下载与数据库配置 启动服务器 执行 nacos-server-2.2.3\bin 下的startup.sh或者startup.cmd (根据不同系统) windows 下nacos 单机启动 方式一: 1,打开cmd 2,cd 到nacos-s…

数据库数据恢复-SQL SERVER数据库分区被格式化的数据恢复方案

SQL SERVER数据库故障类型: 1、SQL SERVER数据库文件被删除。 2、SQL SERVER数据库所在分区格式化。 3、SQL SERVER数据库文件大小变为“0”。 4、使用备份还原数据库时覆盖原数据库。 SQL SERVER数据库故障原因: 1、人为误操作。 2、文件系统损坏&#…

基于Yolov8的工业小目标缺陷检测实战(2):动态蛇形卷积(Dynamic Snake Convolution),实现暴力涨点 | ICCV2023

目录 1.工业油污数据集介绍 1.1 小目标定义 1.2 难点 1.3 工业缺陷检测算法介绍 1.3.1 YOLOv8 2.Dynamic Snake Convolution 2.1 Dynamic Snake Convolution加入到yolov8 3.训练结果分析 4.系列篇 1.工业油污数据集介绍 三星油污缺陷类别:头发丝和小黑点&…

AirtestIDE编辑窗内,脚本内容消失,显示一片红色怎么办?

airtest编辑窗内,脚本内容消失,显示一片红色怎么办 如果突然有一天打开脚本,发现脚本全都变成了红色的点(因未知错误导致的脚本异常): 原本辛辛苦苦写的三百多行代码全消失,是不是很难受很心慌…

Android Camera2获取摄像头的视场角(FOV)信息

一、概念 FOV(Field of View)是一个用于描述视野范围的术语。它通常用于计算设备(如摄像机、虚拟现实头显或眼睛)所能捕捉到的可见区域。 水平FOV(Horizontal FOV):描述视野在水平方向上的范围…

可以查看输入字数的手机备忘录软件用哪个?

在当下这个科技迅速发展的时代,我们常常需要依赖备忘录来记录重要的信息、灵感和待办事项。手机备忘录成为了我们随身携带的工具,但是你有没有遇到这样的情况:你写了很多内容,但不知道写了多少字?这个问题或许曾经困扰…

feign结合hystrix的坑

feign结合hystrix的步骤 创建报错类 接口指向报错类 配置文件放开feign的hystrix 最后注意:启动类的EnableHystrix只适用于ribbon负载均衡的场景,如果是feign要去掉

【评论内容关键词提取】多种主流提取算法与大模型测试

文章目录 1. 写在前面2. TextRank关键词提取算法3. TFIDF算法4. jionlp算法5. sklearn算法6. Rake算法7. hanlp情感分析8. 大语言模型 1. 写在前面 做过舆情项目或文本内容情感分析的大家都知道,我们要从大量的文本内容中提取核心短语或者关键词!最近我们…

【分布式计算】副本数据Replicated Data

作用:可靠性、高性能、容错性 问题:如何保持一致、如何更新 问题:存在读写/写写冲突 一个简单的方法就是每个操作都保持顺序,但是因为网络延迟会导致问题 Data-centric models: consistency model?? ??? 读取时&#xff0c…

7-1_MSPI_NANDFLASH SDK例程详解

1.代码示例路径 PRJ_M66_4.3.3\boards\apollo4l_blue_eb\examples\interfaces\mspi_ds35x1ga_quad_example\src\mspi_ds35x1ga_quad_example.c 本文中主要讲解初始化流程内容 2.MSPI通信示意图 SCK(Serial Clock):串行时钟,用于…

web:[HCTF 2018]WarmUp

题目 点进页面&#xff0c;页面只有一张滑稽脸&#xff0c;没有其他的提示信息 查看网页源代码&#xff0c;发现source.php&#xff0c;尝试访问一下 跳转至该页面&#xff0c;页面显示为一段php代码&#xff0c;需要进行代码审计 <?phphighlight_file(__FILE__);class emm…

BCC源码下载

接前一篇文章&#xff1a;BCC介绍 1. GitHub地址 上一篇文章中已提到&#xff0c;BCC的github地址是&#xff1a;https://github.com/iovisor/bcc。 页面如下所示&#xff1a; 2. 源码下载 打开终端&#xff0c;创建好要存放BCC源码的目录&#xff0c;进入此目录。 然后&…

【计算机网络】——传输层

//图片取自王道&#xff0c;仅做交流学习 一、传输层提供的服务 物理层、数据链路层、网络层是通信子网。 传输层&#xff1a;它属于面向通信部分的最高层&#xff0c;同时也是用户功能的最低层 为应用层提供通信服务使用网络层的服务 网络层提供主机之间的逻辑通信。 1、传输…

go sync.Map包装过的对象nil值的判断

被sync.Map包装过的nil 对象&#xff0c;是不能直接用if xxx nil的方式来判断的 func testnil() *interface{} {return nil }func main() {var ptr *interface{}test : testnil()//p &Person{}fmt.Printf("ptr 的值为 : %v\n", ptr)fmt.Printf("ptr 的值…

控价与数据分析的关系

品牌在做线上控价时&#xff0c;会面对许多的数据&#xff0c;如店铺数据、行业数据&#xff0c;当这些数据仅仅只是拿来做监测低价输出低价报表使用&#xff0c;是没有发挥其最大作用的&#xff0c;因为商品链接的字段较丰富&#xff0c;涉及的内容会包含销量、评价量、促销信…

pytorch环境搭建到pycharm项目映射配置(成功后回顾性记录/自用)

利用Anaconda创建pytorch虚拟环境 前提&#xff1a;成功安装Anaconda&#xff0c;确保可以打开NVIDIA控制面板 开始-》搜索“Anaconda Prompt” 打开后输入&#xff1a;conda create -n 你的虚拟环境名 python3.9。输入y&#xff0c;继续安装&#xff0c;完成。 输入&#…

容器适配器

除了顺序容器外&#xff0c;标准库还定义了三个顺序容器适配器&#xff1a;stack、queue和priority_queue适配器。适配器是标准库中的一个通用概念。容器、迭代器和函数都有适配器。适配器本质上是一种机制&#xff0c;能使某种事物的行为看起来像另外一种事物一样。 所有容器…

C++笔记之尾置返回类型(trailing return type)

C笔记之尾置返回类型(trailing return type) 文章目录 C笔记之尾置返回类型(trailing return type)1.尾置返回类型的一些示例用法2.尾置返回类型对泛型编程的好处3.尾置返回类型通常在以下情况下派上用场4.既然auto可以自动类型推断&#xff0c;那为什么还需要尾置返回类型&…