解决nexus3登录x509: certificate has expired or is not yet valid
笔者前面的博文 使用nexus3作为Docker镜像仓库介绍了如何使用nexus3来作为容器的镜像仓库,在生成证书时,使用了有效期限。如果证书过期了,使用podman或者docker登录,则会提示类似如下的信息:
1x509: certificate has expired or is not yet valid: current time 2023-09-12T09:47:03+08:00 is after XXXX-XX-XXTXX:XX:XXX
那如果证书过期了该如何处理呢?
一、重新生成证书,并更新系统的证书
可以将下列脚本保存为文件,修改为自己的IP,并执行:
1# 所有操作在子目录中完成
2mkdir -p output
3cd output
4MYIP=192.168.1.8
5# 创建辅助文件
6echo subjectAltName=IP:${MYIP} > extfile.cnf
7# 生成ca证书
8openssl genrsa -out ca.key 2048
9openssl req -x509 -new -nodes -key ca.key -days 365 -out ca.crt
10# 如果不想交互输入证书的国家,城市,公司名等等信息,可以在上面的命令加上参数:-subj "/CN=*"
11# 生成server证书
12openssl genrsa -out server.key 2048
13openssl req -new -key server.key -subj "/CN=${MYIP}" -out server.csr
14openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -extfile exefile.cnf -out server.crt -days 365
15# 将证书导出成pkcs格式
16# 这里需要输入密码 输入“password”,如果不用这个,需要修改镜像里的${jetty.etc}/jetty-https.xml对应的password
17openssl pkcs12 -export -out keystore.pkcs12 -inkey server.key -in server.crt
18# 复制需要的文件到上层目录
19cp -n keystore.pkcs12 ..
20cp -n ca.crt ../nexus3.crt
21# 复制ca.crt到系统
22sudo cp -n ca.crt /usr/local/share/ca-certificates/nexus3.crt
23# 更新证书
24sudo update-ca-certificates
25cd ..
26rm output -rf
二、复制证书到容器
然后将keystore.pkcs12
复制到现有的nexus3
容器中:
1sudo podman cp keystore.pkcs12 nexus3:/
三、进入容器更新证书
使用root
用户登录进入nexus3
容器:
1sudo podman exec -it --user root nexus3 /bin/bash
在nexus3
容器中执行下面的命令
1keytool -v -importkeystore -srckeystore keystore.pkcs12 -srcstoretype PKCS12 -destkeystore keystore.jks -deststoretype JKS -storepass password -srcstorepass password && cp -n keystore.jks /opt/sonatype/nexus/etc/ssl/
如果报下面的错误:
1keytool error: java.io.IOException: parseAlgParameters failed: ObjectIdentifier() -- data isn't an object ID (tag = 48)
2java.io.IOException: parseAlgParameters failed: ObjectIdentifier() -- data isn't an object ID (tag = 48)
3 at sun.security.pkcs12.PKCS12KeyStore.parseAlgParameters(PKCS12KeyStore.java:819)
4 at sun.security.pkcs12.PKCS12KeyStore.engineLoad(PKCS12KeyStore.java:2027)
5 at java.security.KeyStore.load(KeyStore.java:1445)
6 at sun.security.tools.keytool.Main.loadSourceKeyStore(Main.java:2054)
7 at sun.security.tools.keytool.Main.doCommands(Main.java:1073)
8 at sun.security.tools.keytool.Main.run(Main.java:370)
9 at sun.security.tools.keytool.Main.main(Main.java:363)
10Caused by: java.io.IOException: ObjectIdentifier() -- data isn't an object ID (tag = 48)
11 at sun.security.util.ObjectIdentifier.<init>(ObjectIdentifier.java:285)
12 at sun.security.util.DerInputStream.getOID(DerInputStream.java:320)
13 at com.sun.crypto.provider.PBES2Parameters.engineInit(PBES2Parameters.java:267)
14 at java.security.AlgorithmParameters.init(AlgorithmParameters.java:293)
15 at sun.security.pkcs12.PKCS12KeyStore.parseAlgParameters(PKCS12KeyStore.java:815)
可以更新一下系统:
1yum update
再执行命令:
1keytool -v -importkeystore -srckeystore keystore.pkcs12 -srcstoretype PKCS12 -destkeystore keystore.jks -deststoretype JKS -storepass password -srcstorepass password && cp -n keystore.jks /opt/sonatype/nexus/etc/ssl/
四、重启容器
1sudo podman restart nexus3
五、测试连接
1$ sudo podman login 192.168.1.18:5051
2Authenticating with existing credentials for 192.168.1.18:5051
3Existing credentials are invalid, please enter valid username and password
4Username (podman):
5Password:
6Login Succeeded!
六、Windows使用
将前面的nexus3.crt
证书文件复制到Windows,然后右键选择“安装证书”:
七、Linux系统使用
将前面的nexus3.crt
证书文件复制到Linux的/usr/local/share/ca-certificates/
目录下,然后更新证书:
1sudo update-ca-certificates
- 原文作者:Witton
- 原文链接:https://wittonbell.github.io/posts/2023/2023-09-12-解决nexus3登录x509-certificate-has-expired-or-is-not-yet-valid/
- 版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议. 进行许可,非商业转载请注明出处(作者,原文链接),商业转载请联系作者获得授权。