笔者前面的博文 使用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