小迅的神奇海螺

Docker部署Nexus3并启用HTTPS

2022-08-15

0x01 目的

  1. docker运行nexus
  2. 通过https访问管理页面
  3. 不额外添加nginx作为反向代理
  4. docker客户端不添加insecure-registry,实现login

0x02 配置

生成证书

  • 没有现成证书的情况
    生成新的keystore.jks

    1
    2
    3
    4
    NEXUS_DOMAIN=nexus.xxx.com \
    NEXUS_IP_ADDRESS=192.168.11.101 \
    PASSWD=admin123; \
    keytool -genkeypair -keystore keystore.jks -storepass ${PASSWD} -keypass ${PASSWD} -keyalg RSA -keysize 2048 -validity 5000 -dname "CN=${NEXUS_DOMAIN}, OU=Nexus, O=Nexus, L=Beijing, ST=Beijing, C=CN" -ext "SAN=IP:${NEXUS_IP_ADDRESS}" -ext "BC=ca:true"
  • 已有https证书的情况
    将证书导出成pkcs12格式

    1
    openssl pkcs12 -export -out keystore.pkcs12 -inkey server.key -in server.crt

    keystore.pkcs12生成keystore.jks

    1
    keytool -export -alias 1 -keystore /nexus-data/keystore.jks -file /nexus-data/keystore.cer -storepass password

准备配置文件

  • 修改nexus-default.properties配置文件
    在文件里添加application-port-ssl属性,可以设置成自己喜欢的端口(避免占用443,之后要预留给docker仓库),并在nexus-args末尾加上https相关的xml文件位置

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    # Jetty section
    # application-port=8081
    application-port-ssl=8443
    # application-host=0.0.0.0
    nexus-args=${jetty.etc}/jetty.xml,${jetty.etc}/jetty-http.xml,${jetty.etc}/jetty-requestlog.xml,${jetty.etc}/jetty-https.xml
    # nexus-context-path=/${NEXUS_CONTEXT}

    # nexus-edition=nexus-pro-edition
    # nexus-features=\
    # nexus-pro-feature
    # nexus.clustered=false
  • 修改jetty-https.xml文件
    修改sslContextFactory节点,修改默认密码为生成证书指定的密码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    <New id="sslContextFactory" class="org.eclipse.jetty.util.ssl.  SslContextFactory$Server">
    <Set name="KeyStorePath"><Property name="ssl.etc"/>/keystore. jks</Set>
    <Set name="KeyStorePassword">password</Set>
    <Set name="KeyManagerPassword">password</Set>
    <Set name="TrustStorePath"><Property name="ssl.etc"/>/ keystore.jks</Set>
    <Set name="TrustStorePassword">password</Set>
    <Set name="EndpointIdentificationAlgorithm"></Set>
    <Set name="NeedClientAuth"><Property name="jetty.ssl. needClientAuth" default="false"/></Set>
    <Set name="WantClientAuth"><Property name="jetty.ssl. wantClientAuth" default="false"/></Set>
    <Set name="IncludeProtocols">
    <Array type="java.lang.String">
    <Item>TLSv1.2</Item>
    </Array>
    </Set>
    </New>

启动

nexus-default.properties文件在data/etc目录里,会自己生成,替换一下就好
然后把keystore.jksjetty-https.xml文件挂载到对应的位置

1
2
3
4
5
docker run --name nexusOSS \
-v /mnt/user/appdata/nexus-data:/nexus-data \
-v /mnt/user/appdata/nexus-data/keystore.jks:/opt/sonatype/nexus/etc/ssl/keystore.jks \
-v /mnt/user/appdata/nexus-data/jetty-https.xml:/opt/sonatype/nexus/etc/jetty/jetty-https.xml \
sonatype/nexus3

nexus首次部署后会生成一个初始密码,位于/nexus-data/admin.password文件中

配置私有仓库

新建一个docker-hosted类型的仓库,然后设置HTTPS端口为443
picture 1

在realms中把 docker bearer token realm 选为 active
picture 2

这样配置以后,就可以通过docker login命令登录了

参考资料

docker部署nexus 并启用https
nexus3配置https支持

使用支付宝打赏
使用微信打赏

若你觉得我的文章对你有帮助,欢迎点击上方按钮对我打赏

扫描二维码,分享此文章