Windows Server 2025建立Cosmian KMS

Cosmian KMS是一款开源的密钥管理系统
官网+文档 传送门 / GitHub 传送门 / 各版本/平台安装程序 传送门
直至博主写出这篇文章时,最新版本为5.23.0
因为博主的ESXi服务器和Veeam备份服务器有需要可信加密的需求,vcentre的NKP不够用,硬件KMS是不可能的,毕竟买了硬件也不能永久使用,授权也不便宜。一通查找之后,就是Cosmian KMS了,不要钱,还能自己搭建😁

准备工作

  • 安装好Windows Server 2025并且已经激活系统的小主机/虚拟机(博主这里用的是Dell Wyse 5070 Thin),最好带有TPM2.0,对全盘用BitLocker进行加密,操作系统设置强密码,BIOS设置通电自启
  • FQDN指向该小主机的IP并做好解析(博主用的FQDN,实际中IP也不是不行)
  • 安装好Git Bash并在环境变量里配置好opsnssl的路径,powerhsell里面会用到
  • 下载好Cosmian KMS的Windows安装包并安装好并设置好cosmian_kms.exe的路径到环境变量,这里设安装路径是C:\Cosmian KMS\(其实只要装Server就行了,CLI没什么作用)
    以上步骤做好之后就可以开始了

开始配置

生成 KMS Server CA 和 KMS Server 证书

生成 CA 私钥:

openssl genrsa -out kms-server-ca.key 4096

生成 CA 证书:

openssl req -new -x509 -days 3650 `
  -key kms-server-ca.key `
  -subj "/CN=Cosmian KMS Server CA" `
  -out kms-server-ca.crt

生成 KMS Server 私钥:

openssl genrsa -out kms-server.key 2048

生成 CSR:
注意:如果用IP,-subj "/CN=192.168.1.10"

openssl req -new `
  -key kms-server.key `
  -subj "/CN=kms.lab.local" `
  -out kms-server.csr

关键仍然是后面的 SAN,创建 SAN 配置文件

@"
subjectAltName = DNS:kms.lab.local,IP:192.168.1.10
extendedKeyUsage = serverAuth
keyUsage = digitalSignature,keyEncipherment
"@ | Out-File -Encoding ascii kms-server-ext.cnf

签发 KMS Server 证书:

openssl x509 -req -days 3650 `
  -in kms-server.csr `
  -CA kms-server-ca.crt `
  -CAkey kms-server-ca.key `
  -CAcreateserial `
  -out kms-server.crt `
  -extfile kms-server-ext.cnf

打包成 PKCS#12,供 Cosmian KMS 使用:

openssl pkcs12 -export `
  -in kms-server.crt `
  -inkey kms-server.key `
  -certfile kms-server-ca.crt `
  -out server.p12 `
  -passout pass:ChangeThisServerP12Password

生成 Client CA

这个CA用来签发client certificate,Cosmian KMS 会用它验证客户端是否被允许接入KMS

生成 Client CA 私钥:

openssl genrsa -out clients-ca.key 4096

生成 Client CA 证书:

openssl req -new -x509 -days 3650 `
  -key clients-ca.key `
  -subj "/CN=Cosmian KMS Clients CA" `
  -out clients-ca.crt

创建 client 证书扩展文件:

@"
extendedKeyUsage = clientAuth
keyUsage = digitalSignature,keyEncipherment
"@ | Out-File -Encoding ascii client-ext.cnf

修改kms.toml

打开配置文件:

C:\Cosmian KMS Server\kms.toml

使用以下配置片段,注意路径使用 ‘/’

[db]
database_type = "sqlite"
sqlite_path = "C:/Cosmian KMS Server/cosmian-kms/sqlite-data"

[tls]
tls_p12_file = "C:/Cosmian KMS Server/certs/server.p12"
tls_p12_password = "ChangeThisServerP12Password"
clients_ca_cert_file = "C:/Cosmian KMS Server/certs/clients-ca.crt"

[socket_server]
socket_server_start = true
socket_server_port = 5696
socket_server_hostname = "0.0.0.0"

[http]
port = 9998
hostname = "127.0.0.1"

说明

[db]
  database_type           数据库类型
  sqlite_path             数据库文件路径

[tls]
  tls_p12_file            KMS Server 的服务端证书包
  tls_p12_password        server.p12 的密码
  clients_ca_cert_file    用来验证 vCenter client certificate 的 CA

[socket_server]
  socket_server_start     启用 KMIP socket server
  socket_server_port      KMIP 默认端口 5696
  socket_server_hostname  监听所有网卡

[http]
  port                    HTTP API 端口 9998
  hostname                只监听本机,避免暴露 HTTP API

如果希望从外部可以用 CLI 访问 HTTP API,可以把:

hostname = "127.0.0.1"
改成:
hostname = "0.0.0.0"

但不建议这么做

启动 KMS Server

PowerShell 管理员运行:

cosmian_kms -c "C:\Cosmian KMS Server\kms.toml"

Windows防火墙

在防火墙高级设置里新建规则:5696端口入站规则为允许

vCenter 处配置




在 “使vCenter信任KMS”这里,打开后直接点击信任即可,在“使KMS信任vCenter”这一步,需要将vCenter的CSR上传到KMS后用 client CA 进行签名


把CSR保存为vcenter-client.csr并上传到KMS服务器

KMS 上对 Client CSR 签名

openssl x509 -req -days 3650 `
  -in vcenter-client.csr `
  -CA clients-ca.crt `
  -CAkey clients-ca.key `
  -CAcreateserial `
  -out vcenter-client.crt `
  -extfile client-ext.cnf

签过名的证书上传到vCenter

最终效果:KMS和vCnter之间相互信任

KMS服务设置成服务并开机自启动

这个地方博主踩了不少坑,以下方法已经验证可用
需要用到程序:nssm.exe

新建start-kms.ps1(C盘根目录下)

Set-Location "C:\Cosmian KMS Server"
& "C:\Cosmian KMS Server\cosmian_kms.exe" -c "C:\Cosmian KMS Server\kms.toml"

手动测试

powershell.exe -NoProfile -ExecutionPolicy Bypass -File "C:\start-kms.ps1"

nssm新建服务

.\nssm.exe install "Cosmian KMS"
	
分别填入:
Path:
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
	
Startup directory:
C:\
	
Arguments:
-NoProfile -ExecutionPolicy Bypass -File "C:\start-kms.ps1"

设置服务自启动

sc.exe config "Cosmian KMS" start= auto

启动

sc.exe start "Cosmian KMS"

检查

sc.exe query "Cosmian KMS"
netstat -ano | findstr ":5696"

需要备份的文件

建议备份整个KMS的安装目录,或者以下目录+文件

C:\Cosmian KMS Server\certs
C:\Cosmian KMS Server\kms.toml
KMS 数据库目录,例如 sqlite-data

注意:以下文件特别重要

server.p12
server.p12 密码
clients-ca.crt
clients-ca.key
vcenter-client.p12
vcenter-client.p12 密码
kms.toml
KMS 数据库