再次使用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证书.crt
和client-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。但不想重新签发客户端证书,那么可以重新签发服务端证书,迁移程序的同时更新证书,此过程只需要客户端更新请求地址即可,证书不动(当然,重新签发客户端证书也行)。