草庐IT

使用 KeyStore Explorer 签发 SAN 二级证书在 SpringBoot 中使用

老鼠AI大米_Java全栈 2023-10-11 原文

需要生成一个 CA 根证书并以此签发二级证书,二级证书将作为服务端证书
服务端证书需要附加 SAN (Subject Alternative Name) (使用者可选名称) 信息

场景:

  • 需要生成一个 CA 根证书并以此签发二级证书,二级证书将作为服务端证书
  • 服务端证书需要附加 SAN (Subject Alternative Name) (使用者可选名称) 信息,示例如下


    image.png
  • 最终需要导出为 p12 格式的文件给 SpringBoot 使用

方案:

1. 下载安装

下载 KeyStore Explorer (一个 keytool 的 GUI 工具),其 GitHub 和官网地址如下

https://github.com/kaikramer/keystore-explorer
https://keystore-explorer.org/

个人建议去 GitHub 上下载 zip 包,虽然略微大一些,但可以免安装,解压即用
另外,以下内容均在 5.5.0 版本下截图演示

2. 新建 KeyStore

点击 create a new KeyStore


image.png

格式默认选择 pkcs #12 就行


image.png

新建之后 Ctrl + S 保存一下,此时需要填写密码,这里自己随意设置(但要能记得住),此处演示均使用 123456
image.png

保险起见,保存的时候 Files of Type 下拉框也选择 p12 那个,另外 File Name 需要自己加上 .p12 的后缀名(反正我这个版本不会自动加后缀)


image.png

3. 创建根证书

首先需要创建一个密钥对 (Key Pair),空白处右键第一个就是了

image.png

此处可选算法,一般 RSA 2048 就行
image.png

之后有几处需要注意,一个是有效期 Validity Period ,根据自己的需要填;再个就是 Name 最右边的
按钮,这个一定要点进去填;最后是 Add Extensions 按钮,这个目前可以先不填,但是生成二级证书添加 SAN 信息的时候就需要用到了
image.png

点击上图 Name 最右边的按钮之后,就是这个窗口,这些都需要填,按自己的需求填写就好,此处我均填写为 ca
image.png

然后填写别名
image.png

最后,这里是个坑,此处密钥对的密码可以设为和之前 KeyStore 不一样的,但是会影响到后面 SpringBoot 中的配置,如果只是个人学习使用,避免麻烦,那就设为和 KeyStore 一致的。
演示中密码均为 123456
image.png

然后就得到了一个 CA 根证书的密钥对
image.png

莫得结束,此时只得到了密钥对,并不是证书,右键刚刚生成的密钥对,Export -> Export Certificate Chain
image.png

之后选择格式和保存位置,格式一般默认就行,保存位置自己选
image.png

目前得到的文件如下:
image.png

4. 创建并签发二级证书

如果是用过命令行工具的朋友应该知道签发二级证书的过程应该是 生成 key pair -> 生成 csr 请求 -> 签发并生成 cer 证书

不过 KeyStore Explorer 工具提供了一个便捷的方式,直接在 ca 密钥对上右键 -> Sign -> Sign New Key Pair 即可从生成密钥对到签发一气呵成


image.png

之后需要输入这个密钥对的密码,和之前设置的一致就行


image.png

再之后的过程和上面创建新密钥对的过程差不多,但此时为了给 server 证书添加 SAN 附加信息,就需要用到 Add Extensions 按钮了
image.png

点进来是这样的,选择使用标准模板


image.png

模板选择 SSL Server
image.png

然后会自动生成很多附加信息,选择 要修改的 Subject Alternative Name ,点击右边的修改按钮
image.png

此处就可以修改增删改 SAN 信息了
image.png

增改的窗口如下,常用的是 DNS 和 IP 两种,下方直接填写值即可
image.png

演示中最终填写的 SAN 值如下


image.png

最后最后,别忘了点那个像书一样的按钮,填写 Name 部分,否则一定会报错无法继续的
image.png

之后也会填写密码,为了方便可填为和 KeyStore 一致的,此处就不贴图了

现在得到了两个密钥对,server 就是带有 SAN 信息的服务端密钥对了,别忘了 Ctrl + S 保存一下


image.png

此时,我们可以像导出 ca 根证书那样导出这个 server 证书,但在 SpringBoot 中使用的话,并不需要这一步,直接把这份 test.p12 交给 SpringBoot 就好。

5. 在 SpringBoot 中使用

把这份 test.p12 放在 resources 目录下,然后在配置文件 application.properties 中这样写

#https端口号
server.port=443
#密钥库路径
server.ssl.key-store=classpath:test.p12
#密钥库密码
server.ssl.key-store-password=123456
#密钥库类型
server.ssl.keyStoreType=PKCS12
#使用的证书(密钥对)别名
server.ssl.keyAlias=server

如果之前创建密钥对的时候,没有把 密钥对的密码 填成和 密钥库密码 一致的,那就需要加一行

#密钥对密码
server.ssl.key-password=<要使用的密钥对的密码>

最后配成这样子,SpringBoot能够启动成功,应该就可以了


image.png

当然,此时直接访问 localhost ,肯定会报 SSL 错误,这是因为 server 的上级证书不被我们的浏览器信任。所以我们可以把之前导出的 ca.cer 安装到 受信任的根证书颁发机构(这个位置不能选错,否则系统不会认为这是根证书)


image.png

之后打开浏览器,访问 localhost
image.png

这个 SSL 的 demo 就传到 gitee 上面吧

https://gitee.com/itlove520/ssl_demo

后记

  • 为什么不用 keytool 命令行工具?
    之前笔者也试过用 keytool,在参照了大量博客的情况下,也成功了。但是 keytool 的命令行环境经常需要写一堆参数,用起来的体验也不是特别好,于是在了解到 KeyStore Explorer 的存在后,我立刻被它圈粉了。不过不知道是不是笔记本设置了全局缩放的原因,这个工具的在我的电脑开着中文输入法的时候会不时抽风,但相比于敲一堆又臭又长的命令,我可能更喜欢这个 GUI 界面。

  • p12 和 cer 的区别?
    仅个人见解,不一定准确
    p12 是一个包含了公私钥对的文件,而 cer 只包含了公钥证书

  • 2021年,证书里面的 SAN 信息有多重要?
    2022-06-02 补充:其实把证书的 CN (Common Name) 字段填写正确应该也能避免 NET::ERR_CERT_COMMON_NAME_INVALID 这个问题,具体请参考 https://www.cnblogs.com/iiiiher/p/8085698.html 中的 “浏览器如何验证证书” 部分
    如果使用了上面的 demo,不妨试试把配置文件中的证书别名改成 ca (server.ssl.keyAlias=ca),即使是 ca.cer 那个根证书已经加入系统根证书域的情况下,使用 Edge 96.0.1054.43 (当然,Chromium 内核的) 访问 localhost,依然会报 NET::ERR_CERT_COMMON_NAME_INVALID

    image.png

    这和 ca 证书不受信任的 NET::ERR_CERT_AUTHORITY_INVALID 报错是不同的。说明即使证书受信任,但如果 SAN 信息对不上的话,依然会报错。可见目前证书中 SAN 信息的重要性

参考

https://blog.csdn.net/halberd6/article/details/120252041

有关使用 KeyStore Explorer 签发 SAN 二级证书在 SpringBoot 中使用的更多相关文章

  1. ruby - 如何使用 Nokogiri 的 xpath 和 at_xpath 方法 - 2

    我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div

  2. ruby - 使用 RubyZip 生成 ZIP 文件时设置压缩级别 - 2

    我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看ruby​​zip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d

  3. ruby - 为什么我可以在 Ruby 中使用 Object#send 访问私有(private)/ protected 方法? - 2

    类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc

  4. ruby-on-rails - 使用 Ruby on Rails 进行自动化测试 - 最佳实践 - 2

    很好奇,就使用ruby​​onrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提

  5. ruby - 在 Ruby 中使用匿名模块 - 2

    假设我做了一个模块如下:m=Module.newdoclassCendend三个问题:除了对m的引用之外,还有什么方法可以访问C和m中的其他内容?我可以在创建匿名模块后为其命名吗(就像我输入“module...”一样)?如何在使用完匿名模块后将其删除,使其定义的常量不再存在? 最佳答案 三个答案:是的,使用ObjectSpace.此代码使c引用你的类(class)C不引用m:c=nilObjectSpace.each_object{|obj|c=objif(Class===objandobj.name=~/::C$/)}当然这取决于

  6. ruby - 使用 ruby​​ 和 savon 的 SOAP 服务 - 2

    我正在尝试使用ruby​​和Savon来使用网络服务。测试服务为http://www.webservicex.net/WS/WSDetails.aspx?WSID=9&CATID=2require'rubygems'require'savon'client=Savon::Client.new"http://www.webservicex.net/stockquote.asmx?WSDL"client.get_quotedo|soap|soap.body={:symbol=>"AAPL"}end返回SOAP异常。检查soap信封,在我看来soap请求没有正确的命名空间。任何人都可以建议我

  7. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  8. ruby-on-rails - 'compass watch' 是如何工作的/它是如何与 rails 一起使用的 - 2

    我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t

  9. ruby - 使用 ruby​​ 将 HTML 转换为纯文本并维护结构/格式 - 2

    我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h

  10. ruby - 在 64 位 Snow Leopard 上使用 rvm、postgres 9.0、ruby 1.9.2-p136 安装 pg gem 时出现问题 - 2

    我想为Heroku构建一个Rails3应用程序。他们使用Postgres作为他们的数据库,所以我通过MacPorts安装了postgres9.0。现在我需要一个postgresgem并且共识是出于性能原因你想要pggem。但是我对我得到的错误感到非常困惑当我尝试在rvm下通过geminstall安装pg时。我已经非常明确地指定了所有postgres目录的位置可以找到但仍然无法完成安装:$envARCHFLAGS='-archx86_64'geminstallpg--\--with-pg-config=/opt/local/var/db/postgresql90/defaultdb/po

随机推荐