再次使用xca软件生成自签证书

本文使用 xca 软件的新版本v2.9.0生成自签的证书。

概述

2年前(2023年初),笔者已经使用xca软件生成自签证书进行测试,其时写了篇文章进行介绍,但没有在生产环境上真正使用------没有契机,因为生产环境必须保稳定。

现在有了机会------很多时候,就是缺机会、际遇,但这不是不做准备的理由。于是再次研究,同时计划写一写相关的管理办法和指导方案。即怎么管理证书,如何签发证书,证书记录,等等。

xca是开源项目,截至本文发表时(2025年9月),最新版本为2.9.0。使用上大差不大,但本次多了经验,也更偏向于实际应用。因此,与之前使用的方法稍有不同,但目标是一致。当然,文中所述,依然是笔者的个人使用,不具代表性,仅供参考。

小结

  • 创建各类证书过程大体相类似,只是模板不同。实际使用中,对于证书主题信息,如国家、地区、组织等,基本不会太改,变化的主要是域名、IP地址和有效期之类的信息。因此强烈建议创建种类模板待用,提升效率。
  • 个人实践:保管好xdb数据库和访问数据库的密码,创建好模板,不同业务系统使用不同的私钥创建证书。对于同一业务系统,当需要为新域名或IP新增服务端证书时,基于模板使用同一私钥快速创建,而客户端证书不用再生成。
  • 因为是自签证书,强烈建议使用足够长的有效期,比如50年、100年。笔者见过因证书过期导致的生产事故。虽然与己无关,但却应该引以为戒。
  • xca新的版本与之前的版本,部分文字做了调整。如证书的有效期设置界面,新版本为"生效时间"、"失效时间",之前使用的版本分别为"不早于"、"不晚于"。个人认为新版本的更易理解,旧版本比较生硬。

下载

下载地址1:https://github.com/chris2511/xca/releases

下载地址2:https://hohnstaedt.de/xca/index.php/download

本文下载的是免安装版本,文件名:xca-portable-2.9.0.zip (sha256校验码:50d8a44a795a07ebef4238e22e0318a607f85464aba9f2853e0630196de1141f)

发布日期:2025年3月29日。(注:上次使用的是2.4.0,发布日期为2021年5月8日)

使用:解压后,进入目录,双击 xca.exe 运行即可。

软件界面:

新建数据库

xca使用本地数据库,用于存储创建、存储的证书信息,可长期使用/复用。也支持远程数据库(使用ODBC连接),本文暂不涉及。

当创建好数据库后,下次选择"文件"->"打开数据库",选择数据库,输入密码即可。

点击"文件"->"新建数据库",输入数据库名称,输入2次相同的密码。点击"确定"后会提示PKCS#12算法不安全,根据提示,更改为安全的AES-256-CBC。

下图创建了 foobar.xdb 数据库并使用之。

创建模板

为快速创建证书,本次实践使用模板的方式。

CA模板

创建模板:

在主题页面编辑信息,包括名称和主题信息。

在扩展页面设置有效期。

创建成功:

服务端证书模板

创建模板:

主题信息填充的内容有:

复制代码
模板名称
CN               cststudio
Guangxi          cststudio
Cenxi
cststudio

可在扩展页面再次设置有效期,也可以设置支持的域名或IP(也可不设置)。

IP地址填充:

复制代码
IP:127.0.0.1, IP:192.168.28.11, IP:172.18.18.18,DNS:latelee.cn

创建私钥

私钥可在CA证书、服务端证书等场景使用。可以设置多个私钥,不同的证书使用不同的私钥。

创建私钥:

创建成功:

可多创建几个私钥,用于不同的证书。本文就创建了多个,如下:

创建CA证书

利用自建模板创建CA证书。

在来源页面,签名处只能选"创建自签名证书",因为此时还没有CA证书。选择前面的CA证书模板,注意一定要点击"应用所有信息"按钮。这样就可以直接沿用该模板已填写好的信息了。

在主题页面添加名称,调整主题信息:

主题填充内容如下:

复制代码
证书名称
CN               cststudio
Guangxi          cststudio
Cenxi
cststudio

在扩展页面设置有效时间,此处已是模板的有效期100年,可自行调整。点击"确定"创建。

成功创建CA证书。

创建和导出证书

创建服务端证书

服务端证书的创建过程与CA证书类似, 只是模板不同。

在来源页面,选前面已创建了的CA证书,再服务端证书模板,并点击"应用所有信息"。

在主题页面添加名称,调整主题信息:

在扩展页面设置有效期,指定服务端域名或IP,点击"确定"创建证书。

成功创建证书。

创建客户端证书

客户端证书的创建过程与CA证书类似, 只是模板不同。

在来源页面,选前面已创建了的CA证书,使用CA模板(注意,只是使用了其主题信息),并点击"应用主题信息"。

在主题页面添加名称,调整主题信息,如邮箱地址emailAddress,等。

再在来源页面选client模板,点击"应用扩展信息"。

在扩展页面设置有效期,默认为365天,即1年,可调整。点击"确定"创建证书。

成功创建证书。

证书列表

经过上述步骤,已创建如下的证书:

导出文件

将密钥、CA证书、服务端证书、客户端证书分别导出为单独的文件。下面是部分导出示例。


最终得到如下文件:

复制代码
我的CA证书.crt         证书
client-127.0.0.1.crt  客户端证书
client-127.0.0.1.pfx  客户端浏览器安装的证书
server-127.0.0.1.crt  服务端证书
测试密钥1.pem          生成服务端和客户端的密钥(非生成CA的密钥)

注:经测试,上述的各类证书导出后缀名为pem,也可以在golang中正常使用。

使用笔记

内部名称

在xca中看到的名称是内部名称,可以任意修改。包括私钥、证书、模板等,以私钥为例子说明:

修改数据库密码

xca支持修改数据库密码,可定期修改,让数据库更加安全。示例如下:

私钥列表

在私钥页面,可以查看所有的私钥及使用次数(或是引用的证书的数量?存疑)。

使用模板

本文设置了不同的模板,在创建证书时,可以直接使用模板已有的信息。如下图所示,可以先选CA模板,点击"应用主题信息",此时,将要创建的证书的主题信息就和CA的一样。再选服务端模板,再击"应用扩展信息",此时,证书的扩展信息和服务端模板一样。当然,也可以直接点击"应用所有信息"。但是,这些信息是可以调整的,并不是一成不变,可以理解这些模板减少了实际输入的内容,提升效率。

设置有效期

可按天、月、年为单位,设置后,点击"应用"才能生效。下图为未点击前,失效时间未变化的示例。

调整证书有效期

基于某一个CA证书创建的证书,有效期不能大于CA证书。在创建时,会判断,如出现错误,选择"自动调整日期并继续"即可。

注:从图中可以看到,确认对话框有"仍然继续"选项,笔者选择该项后是可以创建的,但不清楚有什么后果,因此建议不要选。

同时包含多个IP地址的服务端证书

从管理角度看,一个服务端证书绑定一个域名或IP是合理的,但也支持多个,各项以逗号隔开。比如:

复制代码
IP:127.0.0.1, IP:192.168.28.11, IP:192.168.18.10, IP:192.168.28.1, IP:192.168.9.100, IP:172.18.18.18, IP:172.18.18.168, IP:172.18.18.188, DNS:latelee.cn

一个示例如下:

也可以进入编辑模式,一一添加。示例如下:

注意,先添加,再验证,正确后,才能点击"应用"。下图是IP地址不合法,界面出现的提示:

同一CA证书可产生不同服务端的证书

使用同一CA证书,可以创建不同服务端证书(因要指定IP),使用同一客户端可正常请求。

注:从图中也可看到从属关系。

使用既有数据库生成新的证书

可以利用既有数据库和CA生成新的证书,这样能持续创建各类证书。只保证使用相同CA证书和KEY,重新生成服务端证书,增加新的IP地址,客户端证书无法更改也可正常使用。(见上小节图示)

证书实验

光说不练假把式,光练不说傻把式,又练又说真把式。为验证文中的的证书,也为了更深入理解,特使用golang编写服务端和客户端的测试程序。根据不同的场景进行验证。

浏览器访问

由于是自签发证书,浏览器不认,所以会提示不安全,提示证书无效。双击我的CA证书.crtclient-127.0.0.1.pfx 安装证书后,再次访问,错误如旧。这块不是重点,所以目前暂不纠结。


证书详情:

CA证书不同

服务端证书A使用CA证书A生成,客户端证书B使用CA证书B生成。两者无法正常通信。

客户端发送请求时提示如下:

复制代码
tls: failed to verify certificate: x509: certificate signed by unknown authority

服务端提示:

复制代码
TLS handshake error from 10.20.5.240:38919: remote error: tls: bad certificate

证书密钥不同

同一个CA情况下,服务端证书使用密钥A,客户端使用密钥B,两者无法正常通信。(注:上文就设置了2个密钥)

客户端发送请求时提示如下:

复制代码
tls: private key does not match public key

服务端未收到请求,应该是真正发送前已经出错了。

服务端证书过期

将系统时间改为一年后,重新运行服务端和客户端。两者无法正常通信。

客户发送请求时提示如下:

复制代码
tls: failed to verify certificate: x509: certificate has expired or is not yet valid: current time 2026-09-29T02:29:24+08:00 is after 2026-09-28T15:30:00Z

服务端提示:

复制代码
2026/09/29 02:29:24 http: TLS handshake error from 127.0.0.1:59969: remote error: tls: bad certificate

注意,客户端输出的证书有效期时间2026-09-28T15:30:00Z为UTC时间。

客户端证书过期

创建客户端证书过程中,需指定客户端的证书有效期(默认1年内)。不过,经过多次测试,发现即使客户端证书过期了,只要服务端证书正常,请求还是正常的。但这结论和自己的认知不一样。不确定是不是测试方法有误。

服务端证书IP不匹配

服务端证书绑定了域名或IP地址,如证书不在指定的域名或IP服务器运行,则无法请求。即本是服务器A的证书,在服务器B上使用,客户端无法请求B服务。解决方法:

测试示例:

复制代码
B服务器日志输出:
http: TLS handshake error from 192.168.28.1:65102: remote error: tls: bad certificate
客户端请求输出:
send post failed: Post "https://192.168.28.11:9000/testing": x509: certificate is valid for 127.0.0.1, not 192.168.28.11

上面测试的是客户端与服务端之间的通信请求。如果在B服务器上使用服务器A的证书,则使用浏览器依然可以访问。

服务端证书新增IP

接上面的测试,围绕一个场景:

假定已经签发了服务端和客户端,目前服务端程序运行于A机器 上,IP为127.0.0.1。因某些原因,需要将其迁移到B机器上,IP为192.168.28.11。但不想重新签发客户端证书,那么可以重新签发服务端证书,迁移程序的同时更新证书,此过程只需要客户端更新请求地址即可,证书不动(当然,重新签发客户端证书也行)。

相关推荐
阿里超级工程师1 天前
ios云打包证书申请不需要苹果电脑也是可以的
ios·证书·云打包
RollingPin1 天前
iOS八股文之 网络
网络·网络协议·ios·https·udp·tcp·ios面试
せいしゅん青春之我2 天前
[JavaEE初阶]HTTPS-SSL传输过程中的加密
https·java-ee·ssl
2501_916007473 天前
iOS 混淆工具链实战,多工具组合完成 IPA 混淆与加固(iOS混淆|IPA加固|无源码混淆|App 防反编译)
android·ios·小程序·https·uni-app·iphone·webview
2501_915909063 天前
iOS 26 文件管理实战,多工具组合下的 App 数据访问与系统日志调试方案
android·ios·小程序·https·uni-app·iphone·webview
2501_915918413 天前
掌握 iOS 26 App 运行状况,多工具协作下的监控策略
android·ios·小程序·https·uni-app·iphone·webview
00后程序员张4 天前
HTTPS 包 抓取与分析实战,从抓包到解密、故障定位与真机取证
网络协议·http·ios·小程序·https·uni-app·iphone
局i4 天前
HTTP与HTTPS的区别
网络协议·http·https
00后程序员张5 天前
iOS混淆与IPA文件加固全流程实战 防止苹果应用被反编译的工程级方案
android·ios·小程序·https·uni-app·iphone·webview
2501_915106325 天前
iOS 应用加固与苹果软件混淆指南,如何防止 IPA 被反编译与二次打包?
android·ios·小程序·https·uni-app·iphone·webview