证书文件的格式
证书文件有两种格式:
①PEM格式:.crt .cer(windows) .pem .key
②PKCS12格式:.p12 .pfx
将证书转为java的JKS密钥库
很多情况,java程序直接使用JKS 来存储证书,所以我们有需求将证书转为 JKS
唯一指定的官方工具是keytool
# 查看keytool版本
keytool --version
使用keytool将证书转为JKS格式有个限制,keytool只能接受将PKCS12格式的证书直接转为JKS格式,
也就是说如果证书是PEM格式的,需要先转为PKCS12格式再转为JKS格式
核心转换流程
crt/cer/pem + key → pfx/p12(openssl) → jks(keytool) ✅ 两步走
pfx/p12 → jks(keytool) ✅ 一步走
# 1. PEM转PKCS12 由于PKCS12也是如jks一样是个密钥库,所以需要输入密钥库的密码
openssl pkcs12 -export -in cert.crt -inkey private.key -out cert.pfx -name mycert
# 2. PKCS12转JKS(通用)
keytool -importkeystore -srckeystore cert.pfx -srcstoretype PKCS12 -destkeystore cert.jks -deststoretype JKS
# 3. 验证JKS有效性
keytool -list -v -keystore cert.jksPEM格式转为PKCS12格式的时候为什么要-inkey加入私钥? 因为PKCS12格式的文件并不是像PEM格式的文件是单一的文件,而是一个完整的打包密钥库,公钥和私钥是成对存储的,也可以放入证书链。
必须同时包含【证书公钥】 + 【证书私钥】的一体化文件
PKCS12 是公私钥一体化文件,必须同时包含公钥 (crt) 和私钥 (key),缺一不可
使用acme.sh来管理证书
安装
git clone https://gitee.com/neilpang/acme.sh.git
cd acme.sh/
./acme.sh --install -m my@example.com
source .bashrc管理证书,申请证书
export Ali_Key="LTAI5tA********************"
export Ali_Secret="itvSmJ*************"
acme.sh --issue --dns dns_ali -d liaozesheng.cn -d *.liaozesheng.cn --force
#安装
acme.sh --install-cert -d *.liaozesheng.cn --key-file /etc/nginx/certs/*.liaozesheng.cn.key --fullchain-file /etc/nginx/certs/*.liaozesheng.cn.pem --reloadcmd "service nginx force-reload"查看定时任务
crontab -l
#
38 19 * * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null📁 自建证书
私有根CA
现在要做的是建立一个私有根CA,然后用这个根CA来签发GitLab的证书。这样做的好处是:只需要在客户端安装一次根证书,以后所有由这个根CA签发的证书都会被信任。
1. 准备工作目录
# 创建必要的目录结构
sudo mkdir -p /etc/pki/CA/{certs,crl,newcerts,private}
sudo mkdir -p /etc/pki/CA/requests # 存放证书签名请求
sudo chmod 700 /etc/pki/CA/private
# 创建CA的必要索引文件
sudo touch /etc/pki/CA/index.txt
sudo echo 1000 > /etc/pki/CA/serial2. 生成根CA的私钥和证书
2.1 创建根CA配置文件
sudo nano /etc/pki/CA/root-ca.conf[req]
default_bits = 4096
prompt = no
default_md = sha256
distinguished_name = dn
x509_extensions = v3_ca
[dn]
C = CN
ST = Beijing
L = Beijing
O = My Private CA
OU = IT
CN = My Private Root CA
[v3_ca]
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always,issuer
basicConstraints = critical, CA:TRUE, pathlen:0
keyUsage = critical, keyCertSign, cRLSign2.2 生成根CA私钥
cd /etc/pki/CA
sudo openssl genrsa -out private/root-ca.key 4096
sudo chmod 400 private/root-ca.key2.3 生成根CA证书(自签名)
sudo openssl req -new -x509 -days 3650 \
-key private/root-ca.key \
-out root-ca.crt \
-config root-ca.conf3. 为GitLab生成证书(由根CA签发)
3.1 创建GitLab证书配置文件
sudo nano /etc/pki/CA/requests/gitlab.ext-216.com.conf[req]
default_bits = 2048
prompt = no
default_md = sha256
distinguished_name = dn
req_extensions = req_ext
[dn]
C = CN
ST = Beijing
L = Beijing
O = Your Organization
OU = IT
CN = gitlab.ext-216.com
[req_ext]
subjectAltName = @alt_names
keyUsage = keyEncipherment, dataEncipherment, digitalSignature
extendedKeyUsage = serverAuth
[alt_names]
DNS.1 = gitlab.ext-216.com
#DNS.2 = gitlab.local # 如果有本地别名可以加上
#IP.1 = 你的服务器IP # 如果有固定IP,可以加上3.2 创建CA签署配置文件(用于签发)
sudo nano /etc/pki/CA/signing.conf[ca]
default_ca = CA_default
[CA_default]
database = /etc/pki/CA/index.txt
serial = /etc/pki/CA/serial
new_certs_dir = /etc/pki/CA/newcerts
certificate = /etc/pki/CA/root-ca.crt
private_key = /etc/pki/CA/private/root-ca.key
default_days = 365
default_md = sha256
preserve = no
policy = policy_loose
[policy_loose]
countryName = optional
stateOrProvinceName = optional
localityName = optional
organizationName = optional
organizationalUnitName = optional
commonName = supplied
emailAddress = optional
[req_ext]
subjectAltName = @alt_names
keyUsage = keyEncipherment, dataEncipherment, digitalSignature
extendedKeyUsage = serverAuth
[alt_names]
DNS.1 = gitlab.ext-216.com3.3 生成GitLab证书私钥和证书签名请求
cd /etc/pki/CA
# 生成私钥
sudo openssl genrsa -out private/gitlab.ext-216.com.key 2048
sudo chmod 600 private/gitlab.ext-216.com.key
# 生成证书签名请求
sudo openssl req -new \
-key private/gitlab.ext-216.com.key \
-out requests/gitlab.ext-216.com.csr \
-config requests/gitlab.ext-216.com.conf3.4 使用根CA签发GitLab证书
sudo openssl ca -in requests/gitlab.ext-216.com.csr \
-out certs/gitlab.ext-216.com.crt \
-config signing.conf \
-extensions req_ext \
-batch4. 部署证书到GitLab
4.1 复制证书到GitLab SSL目录
# 复制私钥和证书
sudo cp private/gitlab.ext-216.com.key /etc/gitlab/ssl/
sudo cp certs/gitlab.ext-216.com.crt /etc/gitlab/ssl/
# 设置权限
sudo chmod 600 /etc/gitlab/ssl/gitlab.ext-216.com.key
sudo chmod 644 /etc/gitlab/ssl/gitlab.ext-216.com.crt4.2 配置GitLab使用新证书
sudo nano /etc/gitlab/gitlab.rb确保以下配置正确:
external_url 'https://gitlab.ext-216.com'
nginx['ssl_certificate'] = "/etc/gitlab/ssl/gitlab.ext-216.com.crt"
nginx['ssl_certificate_key'] = "/etc/gitlab/ssl/gitlab.ext-216.com.key"4.3 重新配置GitLab
sudo gitlab-ctl reconfigure
sudo gitlab-ctl restart5. 客户端信任根证书
为了让浏览器信任你的GitLab证书,需要在访问的客户端上安装根证书:
Windows客户端
# 首先将根证书从服务器复制到客户端
scp root@your-server:/etc/pki/CA/root-ca.crt ./然后双击 root-ca.crt:
- 点击”安装证书”
- 选择”本地计算机”
- 选择”将所有的证书都放入下列存储”
- 点击”浏览”,选择”受信任的根证书颁发机构”
- 完成安装
Linux客户端
# 复制根证书
sudo cp root-ca.crt /usr/local/share/ca-certificates/
sudo update-ca-certificatesmacOS客户端
# 双击root-ca.crt
# 在钥匙串访问中,将证书添加到"系统"钥匙串
# 双击证书,展开"信任",设置为"始终信任"6. 验证证书
# 检查GitLab证书是否由你的根CA签发
openssl verify -CAfile /etc/pki/CA/root-ca.crt \
/etc/gitlab/ssl/gitlab.ext-216.com.crt应该输出:/etc/gitlab/ssl/gitlab.ext-216.com.crt: OK
📋 文件清单
操作完成后,你的主要文件如下:
/etc/pki/CA/
├── private/
│ ├── root-ca.key # 根CA私钥(权限400)
│ └── gitlab.ext-216.com.key # GitLab私钥
├── certs/
│ └── gitlab.ext-216.com.crt # 签发的GitLab证书
├── root-ca.crt # 根CA证书(需要分发给客户端)
├── index.txt # CA数据库
├── serial # 序列号文件
└── newcerts/ # 存放所有已签发证书的备份