惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

S
Schneier on Security
A
Arctic Wolf
S
Security Affairs
O
OpenAI News
SecWiki News
SecWiki News
TaoSecurity Blog
TaoSecurity Blog
H
Heimdal Security Blog
T
Threat Research - Cisco Blogs
Hacker News: Ask HN
Hacker News: Ask HN
N
News | PayPal Newsroom
Google Online Security Blog
Google Online Security Blog
C
Cisco Blogs
The Hacker News
The Hacker News
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
C
CXSECURITY Database RSS Feed - CXSecurity.com
P
Privacy International News Feed
V
Vulnerabilities – Threatpost
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
酷 壳 – CoolShell
酷 壳 – CoolShell
H
Hacker News: Front Page
T
Tenable Blog
T
The Exploit Database - CXSecurity.com
Recent Commits to openclaw:main
Recent Commits to openclaw:main
Spread Privacy
Spread Privacy
人人都是产品经理
人人都是产品经理
www.infosecurity-magazine.com
www.infosecurity-magazine.com
V2EX - 技术
V2EX - 技术
L
LINUX DO - 最新话题
The GitHub Blog
The GitHub Blog
博客园 - 三生石上(FineUI控件)
T
The Blog of Author Tim Ferriss
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
V
Visual Studio Blog
The Cloudflare Blog
N
News and Events Feed by Topic
量子位
Google DeepMind News
Google DeepMind News
Application and Cybersecurity Blog
Application and Cybersecurity Blog
L
LINUX DO - 热门话题
P
Palo Alto Networks Blog
Stack Overflow Blog
Stack Overflow Blog
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
Attack and Defense Labs
Attack and Defense Labs
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Hacker News - Newest:
Hacker News - Newest: "LLM"
Apple Machine Learning Research
Apple Machine Learning Research
The Register - Security
The Register - Security
Microsoft Security Blog
Microsoft Security Blog
Know Your Adversary
Know Your Adversary
Webroot Blog
Webroot Blog

Li Hui Blog

工作流调研与实践经验 从零开始搭建单节点 ELK 浅谈一个产品的用户引导 归档 GoCD 加入基础密码验证 搭建一套 gocd 的环境 如何使用 gitbook cli工具 React JSX语法再实践 React 组件示例 如何搭建第一个 React 程序 [SpringBoot 指南] 连接 mysql 数据库并进行增删改查测试 [SpringBoot 指南] 如何开始 Springboot 之旅 实现自己第一个接口 LeetCode刷题笔记 VPC笔记 读书的目的 [人文书籍] 把时间当作朋友 Docker基础命令 [技术书籍]JSON必知必会 Docker原理研究 使用Ubuntu 及宝塔搭建Ghost平台 [Linux]Ubuntu安装宝塔面板 2020年年终总结 CURL学习教程 2020年度计划记录 [安全系列]生成ssh证书 [CLI应用学习]时间使用GitHub CLI [linux系列] 修改主机用户名 轻松学CLI应用总章节 [Shell编程系列]基础教程2 [Shell编程系列]基础教程1 [安全相关]使用腾讯云子账号提高账号安全性 [Git教程系列]基础教程5 解决修改错分支的问题 [博客优化]为Wordpress加入伪静态 2020年的12本书籍 [Git系列教程]基本使用4 Git log的使用 [Git系列教程]Git基础操作3 [Git教程系列]基础操作2 [Git教程系列]Git初次配置 [周年总结]脉脉深情,深思志远,周年总结计划 [博客优化]为网站添加SSL证书 [博客优化]Wordpress加入redis服务器提高速度 开篇词 Posts Archive Li Hui Blog
如何搭建私有仓库 Nexus 并配置 SSL 证书
2024-08-31 · via Li Hui Blog

起因

第一个问题是我们为什么要用私有仓库?

私有仓库的好处有很多,比如我们可以自己控制版本,可以自己控制发布的内容,可以自己控制发布内容的权限等等。

第二个问题是当前搭建私有的 nexus 仓库有哪些坑?

自从 maven 3.8.1 开始,默认不允许使用 http 协议拉取依赖,只允许 https 协议(否则就要修改一系列的配置),所以需要配置 nexus 使用 https 协议。 但配置 https 对于对于内网私有仓库就有了问题,因为内网没有公网域名或者而ip,因此没办法找到一个域名颁发机构,为私有 ip 颁发 https 证书,这个时候就需要自己生成对应的自签证书来解决 https 证书的问题。

第三个问题是除了本文中的搭建 nexus 并自签证书之外是否可以有一个好的解决方案?

有的

最简单方案:

公网搭建服务,内网使用域名来访问,这样就不需要自签证书,使用公网证书,域名访问,https 协议,完美解决。

稍微复杂一点的方案:

内网搭建服务,内网使用域名来访问,内网 DNS 统一管理,这样就不需要自签证书,使用公网证书,域名访问,https 协议访问,完美解决。

本文的最复杂方案:

内网搭建服务,内网使用 ip 来访问,自签证书,https 协议访问,这里就有两个问题,

  1. 自签证书,浏览器不信任,需要手动添加信任。
  2. 自签证书,maven 不信任,需要手动添加信任,这里采用 keytool。

如何搭建私有仓库

部署 nexus

部署软件最简单的方案就是采用 docker 容器化部署,这里我使用 sonatype/nexus3 镜像来搭建私有仓库。

为了方便,且可以持久化数据,我使用 docker-compose 来搭建。

创建 nexus 的文件夹

并进入到 nexus 文件夹 创建 docker-compose.yml 文件

1cd nexus
2touch docker-compose.yml

具体 docker-compose.yml 文件内容如下

 1version: "3.3"
 2services:
 3  nexus:
 4    image: sonatype/nexus3
 5    container_name: nexus3
 6    restart: always
 7    environment:
 8      - TZ=Asia/Shanghai
 9    ports:
10      - 8081:8081
11    volumes:
12      - ./data:/nexus-data

这里我使用了 8081 端口,如果你的服务器上有其他服务使用了 8081 端口,可以修改为其他端口(比如想用宿主机的8090 端口可以修改上述的 ports 为 8090:8081)。

然后执行 docker-compose up -d 即可启动 nexus 服务。

访问 http://your-ip:8081 即可看到 nexus 的登录页面。

点击登录可以看到需要输入账号密码信息。

nexus-install-init-web

如何查看默认密码

1docker exec -it nexus3 cat /nexus-data/admin.password

然后在页面中就登录到 nexus 了,首先展示的是修改密码页面。

然后就可以修改对应的密码了。

这里有一个文件权限的问题,可能第一次启动不成功,最简单的话 可以如下修改权限即可

使用 nginx 代理 ssl

搭建 nginx 并增加如下配置

 1server {
 2    listen 8443 ssl; # 监听443端口,并使用SSL
 3
 4    ssl_certificate /Users/xxx/Desktop/cert/10.10.9.10.pem; # SSL证书路径
 5    ssl_certificate_key /Users/xxx/Desktop/cert/10.10.9.10-key.pem; # SSL私钥路径
 6
 7    location / {
 8        proxy_pass http://localhost:8081; # 转发到内网8081端口
 9        proxy_set_header Host $host;
10	      proxy_set_header X-Forwarded-Proto "https";
11        proxy_set_header X-Real-IP $remote_addr;
12        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
13	 			proxy_set_header Content-Length $content_length;
14    }
15}

这部分并不是必须的,如果你的 nexus 仓库是公网的,或者可以申请域名证书,那么可以直接使用公网证书,如果是内网的,那么方案就只能是自签证书了。

自签证书相对来说麻烦一些,你需要手动创建证书,并且将证书添加到可信证书管理中。

比如我们这里就需要自己创建证书,因为浏览器不信任自签证书,因此手动添加信任,因为 java 不信任自签证书,需要使用 keytool 手动添加信任。

自签证书

这里为了简单 我们使用 mkcert 来生成证书, 如果使用 openssl 生成自签证书,可参照 https://docs.pingcap.com/zh/tidb/stable/generate-self-signed-certificates 内容

下面的内容是 Mac 的安装教程,如果使用其他内容,可以参照 https://github.com/FiloSottile/mkcert 这个代码仓库的Readme

 1# 安装 mkcert
 2brew install mkcert
 3
 4mkdir ./mkcert-cer
 5
 6# 使用 mkcert 安装根证书 此时已经自动添加到本地的信任库中,在 mac 上是 keychain Access -> System -> Certificates
 7mkcert install 
 8
 9# 使用 mkcert 签名指定域名
10mkcert 10.10.9.10

添加信任

添加信任其实主要添加的是 CA(Certificate Authority) 证书的信任,即根证书的信任,信任了根证书,其他由根证书签发的证书也就自动信任了,

能否只信任签发证书呢? 可以的,但是增加了我们的复杂性,比如需要手动信任下级证书,使用自定义信任链等内容,这增加了我们对于自签证书的工作量。

添加浏览器信任

如果通过 mkcert 生成的证书,其实在 mkcert install 的时候已经信任过了,在mac 的证书服务中,可以看到对应的证书已经存在。

/mac-local-certification-mkcert.png

双击可以对其添加信任

trust-mkcert-local-certification.png

添加 java 信任

命令如下:

1keytool -import -alias nexus-self-sign -keystore  "/Users/lihui/.sdkman/candidates/java/17.0.11-amzn/lib/security/cacerts" -file mkcert_lihui@bogon.cer

如何知道自己当前使用的哪一个目录 java 呢?

既可找到对应的 java 的目录信息,如果是 sdkman 可能 java 的位置有些差异,

与 Springboot 集成

前提条件

  1. 已经搭建好 nexus 仓库
  2. 已经为 nexus 仓库配置好 ssl 证书
  3. 本地已经配置好浏览器的 https 证书 以及 java 的 https 证书认证

配置 maven

在 Springboot 集成的时候主要有两个问题,即需要使用 https 的要求,以及如果使用自签的 https 证书 java 不信任的问题。

发布到私有仓库

代码仓库配置远端地址

在 maven 的 pom.xml 中的 project 层级(即项目层级)下增加如下信息

 1 <distributionManagement>
 2        <repository>
 3            <id>private-releases</id>
 4            <name>私有 release 仓库</name>
 5            <url>https://10.10.9.10:8443/repository/maven-releases/</url>
 6        </repository>
 7        <snapshotRepository>
 8            <id>private-snapshot</id>
 9            <name>私有 snapshot 仓库</name>
10            <url>http://10.10.9.10:8443/repository/maven-snapshots/</url>
11        </snapshotRepository>
12    </distributionManagement>

发布到远程仓库

直接使用 maven 的 deploy 地址即可将其提交到远端地址。

打开远端地址可以看到如下内容

nexus-remote-jar-showcase-and-detail.png

从私有仓库拉取

配置私有仓库信息

在 maven 的 pom.xml 中的 project 层级(即项目层级)下增加如下信息

 1<repositories>
 2          <repository>
 3            <id>private-releases</id>
 4            <name>私有 release 仓库</name>
 5            <url>https://10.10.9.10:8443/repository/maven-releases/</url>
 6            <releases>
 7                <enabled>true</enabled>
 8            </releases>
 9        </repository>
10    </repositories>

此时即可使用 maven 的 clean package 进行下载私有仓库的依赖信息。当前也首先要在 dependencies 中增加自己的私有仓库的包。

附录

如何将证书分享给其他人

1. 导出证书

右键点击导出,即可导出对应的 CA 公钥证书,将证书文件发送给其他人即可。

export-mkcert-local-certification.png

2. 安装证书

双击证书文件即可安装,再如上添加信任即可通过浏览器访问自签的网站地址。

本文章于 2024-08-19T12:07:00+08:00 开始写,并于 2024-08-31 19:05:00+08:00 完成发布