如何通过docker-compose配置实现Nexus的SSL安全加固(无需Nginx)
如何通过docker-compose配置实现Nexus的SSL安全加固(无需Nginx)
嘿,刚好我之前做过类似的配置,不用Nginx完全可以让Nexus自己搞定SSL!你已经挂载了证书卷,接下来只要做两件事:把证书转换成Nexus能识别的Java密钥库格式,再修改docker-compose.yml配置参数就行,一步步来:
第一步:把你的PEM证书转换成Java JKS密钥库
Nexus是Java应用,不认普通的PEM格式证书,得转成JKS(Java KeyStore)格式。假设你的证书文件是cert.pem,私钥是key.pem,都在/var/volume/nexus/certs目录下,执行下面的命令:
- 先把证书和私钥打包成PKCS12格式(这是中间过渡格式):
openssl pkcs12 -export -in /var/volume/nexus/certs/cert.pem -inkey /var/volume/nexus/certs/key.pem -out /var/volume/nexus/certs/nexus.p12 -name nexus
执行时会让你设置一个PKCS12的密码,记好这个密码,后面要用!
- 再把PKCS12转成JKS密钥库:
keytool -importkeystore -srckeystore /var/volume/nexus/certs/nexus.p12 -srcstoretype PKCS12 -destkeystore /var/volume/nexus/certs/nexus-keystore.jks -deststoretype JKS
这里需要输入刚才设置的PKCS12密码,然后设置JKS密钥库的密码(建议和PKCS12密码一致,方便管理),别名就用nexus就行。
- (可选)如果你的证书是自签名或者来自内部CA,记得把CA证书导入到信任库:
keytool -import -trustcacerts -file /var/volume/nexus/certs/ca.pem -alias ca -keystore /var/volume/nexus/certs/nexus-truststore.jks
同样设置信任库的密码,记住它。
第二步:修改你的docker-compose.yml配置
现在把你的原docker-compose改成下面这样,重点是添加环境变量和调整端口:
version: '3.8' services: nexus: image: sonatype/nexus3:latest container_name: nexus volumes: - nexus-data:/nexus-data # 原来的Nexus数据卷 - /var/volume/nexus/certs:/certs:ro # 你已经挂载的证书卷,ro是只读,更安全 environment: # 指定Nexus使用Jetty的HTTPS配置文件 - NEXUS_ARGS="--jetty.etc=/nexus-data/etc/jetty/jetty-https.xml" # 设置Java虚拟机的SSL参数,指向我们生成的密钥库和信任库 - INSTALL4J_ADD_VM_PARAMS="-Djavax.net.ssl.keyStore=/certs/nexus-keystore.jks -Djavax.net.ssl.keyStorePassword=你的JKS密码 -Djavax.net.ssl.trustStore=/certs/nexus-truststore.jks -Djavax.net.ssl.trustStorePassword=你的信任库密码" ports: - "8443:8443" # SSL端口,如果你想用标准443端口,可以改成"443:8443"(注意:443是特权端口,可能需要调整容器权限) restart: unless-stopped volumes: nexus-data:
几个关键配置说明:
NEXUS_ARGS:告诉Nexus加载Jetty的HTTPS配置文件,默认这个文件在Nexus数据卷里已经存在,不用额外创建。INSTALL4J_ADD_VM_PARAMS:给Java虚拟机传递SSL相关的参数,指定密钥库、信任库的路径和密码,这些参数会让Nexus启动时启用SSL。- 端口:把原来的8081端口换成8443(Nexus默认的HTTPS端口),如果要对外用443,直接映射即可,但要注意Linux系统中1024以下的端口需要root权限,你可以给容器加
cap_add: NET_BIND_SERVICE权限,或者用iptables转发。
第三步:重启Nexus服务
执行命令重启容器:
docker-compose down && docker-compose up -d
等个几分钟让Nexus启动完成,然后访问https://你的服务器IP:8443,如果能正常打开Nexus页面,说明SSL配置成功了!
额外注意事项:
- 证书权限:确保容器里的
nexus用户能读取/certs目录下的文件,你可以在主机上执行chmod 644 /var/volume/nexus/certs/*.jks和chmod 755 /var/volume/nexus/certs来设置权限。 - 密码安全:不要把密码硬编码在docker-compose.yml里!建议用
.env文件存储密码,比如创建一个.env文件:
然后在docker-compose里改成KEYSTORE_PASSWORD=你的JKS密码 TRUSTSTORE_PASSWORD=你的信任库密码${KEYSTORE_PASSWORD}和${TRUSTSTORE_PASSWORD},这样更安全。 - 关闭HTTP端口:如果不需要HTTP访问了,可以把原来的8081端口映射删掉,强制所有流量走HTTPS。
备注:内容来源于stack exchange,提问作者akshatha prakash
相关产品推荐
相关产品推荐

