目前我司的技术栈是Java和Python,且都调用第三方的服务,因此需要mock第三方的服务以便开发测试使用。之前已整理过[Python requests信任自签证书的问题]。(https://blog.csdn.net/windy135/article/details/79861209)因此这次需要再Java中mock第三方服务。

java官方文档:
1、使用keytool工具生成证书,然后将cer文件给mock 服务器:(即本文的反向解决办法)
https://docs.oracle.com/cd/E19798-01/821-1841/gjrgy/
2、关于keytool的官方说明:
https://docs.oracle.com/javase/6/docs/technotes/tools/solaris/keytool.html

If keytool fails to establish a trust path from the certificate to be imported up to a self-signed certificate (either from the keystore or the "cacerts" file), the certificate information is printed out, and the user is prompted to verify it, e.g., by comparing the displayed certificate fingerprints with the fingerprints obtained from some other (trusted) source of information, which might be the certificate owner himself/herself. Be very careful to ensure the certificate is valid prior to importing it as a "trusted" certificate! -- see WARNING Regarding Importing Trusted Certificates. The user then has the option of aborting the import operation. If the -noprompt option is given, however, there will be no interaction with the user.

可以理解为从jdk1.6开始,keytool工具支持导入生成好的自签名证书。

下面说一下探索路径

1、已有RSA:2048 -x509自签证书,因此想着将这个证书导入jdk中即可;
2、因为我司使用的容器部署,方法:

存放证书:echo -e "${nginx.crt}" > $JAVA_HOME/jre/lib/security/cacerts
打到证书库:keytool -import -trustcacerts -alias nginx -file nginx.crt -keystore cacerts -storepass changeit -keyalg RSAs -noprompt

3、于是乎,先在docker中测试了一波,成功打进证书,postman请求, 缺收到了如下报错:

sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

于是怀疑JVM在启动的时候会先把cacerts证书加载到虚拟机中,因此可能需要重启;
4、将2中内容写入dockerfile,执行gitlab-ci,却发现了如下错误:
Error Importing SSL certificate : Not an X.509 Certificate
此时有点慌(毕竟容器中是测试通过的,但是这里却失败了),想着是不是因为还有别的校验机制,一场徒劳的验证就此开始了:

1、首先怀疑证书生成算法有问题,校验证书 openssl x509 -in shouqianba.crt -text,信息都对;
2、试图尝试另一条路,根据证书公私钥生成p12文件,再将p12转为keystore,然后再keytool导入证书,发现还是Not an X.509 Certificate失败;(这一步的)
3、于是继续Google,终于发现[https://stackoverflow.com/questions/9889669/error-importing-ssl-certificate-not-an-x-509-certificate](https://stackoverflow.com/questions/9889669/error-importing-ssl-certificate-not-an-x-509-certificate)中的描述:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20190617090901860.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dpbmR5MTM1,size_16,color_FFFFFF,t_70)
因此将2中的echo命令中多余的空格去掉,X.509 Certificate 验证通过。至此证书问题解决。(其实一开始就不应该怀疑jdk有别的验证,毕竟docker中验证过)

4、重启服务后,调用mock服务通过。
5、ci流程 -开箱即用:关于区分测试环境和线上环境的问题,不同项目做法不同,dockerfile和k8s deployment中都可一区环境,可参考:
k8s(根据文件区分环境,可以设置lifecycle): https://stackoverflow.com/questions/39436845/multiple-command-in-poststart-hook-of-a-container
dockerfile(一般是根据env变量区分,首先要找到ENV变量):
https://stackoverflow.com/questions/43654656/dockerfile-if-else-condition-with-external-arguments

简明步骤:(jdk1.6及以上,keytool支持将crt证书秘钥直接导入证书库)

1、$JAVA_HOME/jre/lib/security路径下存放着jdk校验自签证书的一些规则:

ssl.KeyManagerFactory.algorithm=SunX509
ssl.TrustManagerFactory.algorithm=PKIX
jdk.certpath.disabledAlgorithms=MD2, MD5, SHA1 jdkCA & usage TLSServer, \RSA keySize < 1024, DSA keySize < 1024, EC keySize < 224

2、按照格式生成自签证书:
sudo openssl req -x509 -nodes -days 36500 -newkey rsa:2048 -keyout /etc/nginx/ssl/nginx.key -out /etc/nginx/ssl/nginx.crt
如果需要验证证书是否损坏,可以使用OpenSSL检查下:
openssl x509 -in shouqianba.crt -text
3、将生成好的nginx.crt证书拷贝到$JAVA_HOME/jre/lib/security路径下,完后使用keytool工具将证书打到$JAVA_HOME/jre/lib/security/cacerts
keytool -import -trustcacerts -alias nginx -file nginx.crt -keystore cacerts -storepass changeit -keyalg RSAs -noprompt
说明:keytool默认密码是changeit; -noprompt默认选择yes,不用交互输入。
4、由于该证书在 JVM 启动的时候加载,那时还没有新服务的证书,因此需要中期服务,才能生效。

以上四个步骤便能实现一个mock域名的ssl证书验证问题。

参考:
https://stackoverflow.com/questions/9889669/error-importing-ssl-certificate-not-an-x-509-certificate
https://stackoverflow.com/questions/39436845/multiple-command-in-poststart-hook-of-a-container
https://stackoverflow.com/questions/43654656/dockerfile-if-else-condition-with-external-arguments

关于不重启java-web,在不重启 JVM 的情况下重新加载证书文件的解决办法可参考:
https://blog.csdn.net/defonds/article/details/83061232

java-使用keytool信任自签证书,需要重启相关推荐

  1. java工具keytool生成p12数字证书文件

    Keytool是用于管理**和证书的工具,位于%JAVA_HOME%/bin目录. 使用JDK的keytool工具 1.keytool在jdk的bin目录下 查找jdk目录参考https://blog ...

  2. Java笔记-keytool生成SSL双向证书

    逻辑是这样的: 如果要将其导出成client_trust.jks文件,对应的客户端命令为: @echo on keytool -genkeypair -keyalg RSA -dname " ...

  3. java和签名工具_java 证书工具keytool生成自签名证书和自签CA证书

    jdk自带的证书管理工具叫keytool,在jdk/bin目录下,可以用来生成自签名证书.导入导出证书.打印证书信息等. 1. 名词 自签名证书:用自己的私钥签发自己的公钥即主体信息生成的证书. 证书 ...

  4. 【可食用】KeyTool生成KeyStore,证书、公钥、私钥文档JAVA生成,JAVA实现ECC签名验签

    KeyTool生成KeyStore,证书.公钥.私钥文档JAVA生成,JAVA实现ECC签名验签 一.首先我们可以写个工具类生成密钥对.证书.公钥.私钥文本 jksAndCerGenerator.ja ...

  5. 网络--keytool自签名SSL证书(免费)以及私钥签名、公钥验签

    本文主要介绍keytool自签名SSL证书(免费)以及私钥签名.公钥验签流程,点击查看keytool CA签名SSL证书(收费) 最近给银行做一个系统,虽说是给行内使用的,但是系统要同时支持内外网方式 ...

  6. java中Keytool生成证书

    任何机构或者个人都可以申请数字证书,并使用数字证书对网络通信保驾护航.要获得数字证书,首先需要使用数字证书管理工具,如keytool.OpenSSL等,然后构建CSR(Certificate Sigi ...

  7. java导入可信任证书

    java导入可信任证书 一.使用jdk中的keytool工具导入证书 1. 找到keytool 工具去执行导入命令 Ⅰ. windos环境下 Ⅱ. Linux环境下 2. 常用的keytool 命令 ...

  8. 【笔记】Java 信任所有SSL证书(解决PKIX path building failed问题)

    [笔记]Java 信任所有SSL证书(解决PKIX path building failed问题) 参考文章: (1)[笔记]Java 信任所有SSL证书(解决PKIX path building f ...

  9. Windows gmssl生成SM2证书 + java bc库签名验签

    Windows gmssl生成SM2证书 + java bc库签名验签 openssl生成SM2证书 1 生成密钥 gmssl ecparam -genkey -name sm2p256v1 -tex ...

  10. java keytool nginx_java 自签名证书转 nginx 所需证书

    下面个将介绍怎样利用 jdk keytool 生成自签名证书,然后使用 JKS2PFX 工具将证书转换成 pem 格式.详细步骤如下: (1)先试用 jdk 自带的 keytool 工具生成证书,如下 ...

最新文章

  1. erlang supervisor simple_one_for_one实例
  2. 深度学习——02、深度学习入门——经典卷积神经网络架构实例——AlexNet
  3. Android ServiceConnection
  4. 为什么写公众号,为什么改名字
  5. java 先序遍历_二叉树的前序中序后序遍历(java代码)
  6. [Linux]线程安全和可重入函数
  7. python抢货程序_Python自动化xpath实现自动抢票抢货代码示例
  8. bzoj1070 [SCOI2007]修车 费用流+拆分
  9. 使用pickle模块打包停用词表,加快处理文本数据的速度
  10. Python读写Excel文件中指定区域单元格内容
  11. vb.net 教程 3-8 窗体编程 容器 3 SplitContainer
  12. java jxls_jxls2.3-简明教程
  13. NOTEXPRESS 链接文件夹——让题录在文件夹中共享
  14. 双球坐标系_【天文】教你认识三大天球坐标系!(上)
  15. c语言项目过期什么意思,vs2010为什么总显示此项目已过期 XP系统
  16. sothink swf decompiler反编译的常见错误
  17. Android HDCP开发小结
  18. 【Ubuntu 20.04 LTS】安装向日葵远程控制
  19. abaqus要求计算机配置,Abaqus对电脑硬件配置要求-元王科技(feaworks)
  20. 无损数据压缩算法发展史

热门文章

  1. 5V转1.8V稳压芯片,3.7V转1.8V稳压芯片
  2. ArcGIS Server 10.8.1安装
  3. 一元四次方程c语言程序编写,一元高次方程数值解法C程序实现探讨..doc
  4. python excel写入日期变数字_RPA-使用Python读取Excel日期结果为数字时的转换处理方法...
  5. 回首风之忆(消息类型:聊天记录)
  6. 安防大数据时代的IP摄像机发展
  7. 计算机组成原理之输入输出设备
  8. 5.0以上机器XPOSED框架安装流程
  9. 三流大学和一流大学学生的简历有什么区别?
  10. Bootstrap系列之排版