Skip to content

Repository files navigation

CKMS

Custom KMS — 企业级 Microsoft KMS 激活服务器

KMS v4/v5/v6 全协议兼容 · Anti-CC 防护 · GeoIP 地区过滤 · 远程集中管理 · Web 控制台

License Platform Release Protocol


一、概述

CKMS (Custom KMS) 是一个与 Microsoft KMS (Key Management Service) 协议完全兼容的激活服务器。

本项目在 vlmcsd 核心之上,深度扩展了 Anti-CC 防护ACL 访问控制GeoIP 地区过滤远程集中管理PHP Web 管理后台,覆盖从单机部署到多服务器集群运维的完整场景。


二、核心特性

兼容全系 Windows / Office / Visio / Project 产品激活,开箱即用。

能力 说明
协议兼容 KMS v4 / v5 / v6 全版本支持,MS RPC 与简单 Socket 双传输层
Anti-CC 防护 滑动窗口计数限流,单 IP 超限自动拒绝,防止激活接口被恶意刷量
ACL 访问控制 IP 白名单 / 黑名单,支持单 IP、IP 段、CIDR 子网掩码
GeoIP 过滤 按 ISO 国家码限制允许激活的地区,精准管控来源地域
远程管理 周期心跳上报 + 远端配置双向同步,HMAC-SHA256 签名认证,防重放防篡改
Web 控制台 PHP 管理后台:服务器列表 / 黑白名单 / 参数配置 / 申请审批一站式管理
日志系统 按天滚动写入,自动清理过期日志,保留天数可配置
热重载 运行中发送 SIGHUP 即可重载配置,无需重启服务
多平台 Linux (amd64/i386/arm64) + Windows (x86/x64),预编译二进制开箱即用

三、支持平台

预编译二进制已发布至 GitHub Releases,下载即用。

系统 架构 传输层 链接方式 预编译
Linux x86_64 (amd64) Socket / MS RPC 动态链接 (glibc)
Linux i386 Socket 动态链接 (glibc)
Linux ARM64 (aarch64) Socket 动态链接 (glibc)
Windows x64 Socket / MS RPC 原生 PE
Windows x86 Socket 原生 PE

默认使用内置加密 (CRYPTO=internal),零外部依赖,无需安装 OpenSSL 即可运行。


四、快速开始

4.1 启动服务端

# Linux
chmod +x ckmsd
./ckmsd                              # 默认监听 0.0.0.0:1688

# Windows(管理员 cmd)
ckmsd.exe                            # 前台运行
ckmsd.exe -s                         # 注册为系统服务(安装到 C:\ckmsd)

4.2 验证连接

./ckms                               # 测试本地 127.0.0.1:1688
./ckms 192.168.1.10:1688             # 测试远端服务器
./ckms -v                            # 输出详细信息
./ckms -l Windows                    # 查看可用应用清单

4.3 客户端激活

Windows(管理员 cmd):

slmgr /skms <服务器IP>:1688
slmgr /ipk <GVLK>
slmgr /ato
slmgr /xpr                              :: 查看激活状态

Office(进入 Office 安装目录):

cscript ospp.vbs /sethst:<服务器IP>
cscript ospp.vbs /setprt:1688
cscript ospp.vbs /inpkey:<GVLK>
cscript ospp.vbs /act

GVLK(批量授权密钥)列表详见 man/vlmcsd.7


五、编译教程

5.1 环境依赖

依赖 用途 安装命令 (Debian/Ubuntu)
gcc / clang 主编译器 apt-get install build-essential
GNU make 构建工具 apt-get install make
libssl-dev HTTPS 远程管理(可选) apt-get install libssl-dev
gcc-multilib i386 交叉编译(可选) apt-get install gcc-multilib libc6-dev-i386
gcc-aarch64-linux-gnu ARM64 交叉编译(可选) apt-get install gcc-aarch64-linux-gnu
MinGW-w64 Windows 交叉编译(可选) apt-get install gcc-mingw-w64-x86-64 gcc-mingw-w64-i686

5.2 本机编译

cd src
make                                  # 编译服务端 + 客户端
make allmulti                         # 额外编译多调用二进制

编译产物位于 bin/

产物 说明
vlmcsd KMS 服务端
vlmcs KMS 客户端
vlmcsdmulti 多调用二进制(服务端 + 客户端合一)
lib/libkms.a 静态库(可被第三方程序调用)

5.3 全平台一键构建

仓库提供三个构建脚本,按需选用:

脚本 用途 产物目录
build-release.sh 全平台构建(Linux amd64/i386/arm64 + Windows x64/x86) release/
build-all.sh Linux 三架构交叉编译 dist/
build-linux.sh Linux 三架构(开发用) dist/linux/
./build-release.sh                    # 推荐:一次生成 5 个平台二进制

5.4 Docker 多架构构建

Dockerfile.build 通过 multi-stage 同时构建多架构静态链接版本:

docker build -f Dockerfile.build --target export-amd64 -o ckms-amd64 .

5.5 编译选项

通过 make KEY=VALUE 传入(定义于 src/config.h / GNUmakefile):

选项 默认值 说明
CRYPTO internal 加密后端:internal / openssl / openssl_with_aes / windows / polarssl
HAVE_SSL 0 启用远程管理 HTTPS(需 OpenSSL)
USE_THREADS 自动 启用 pthreads 并发
MAX_THREADS 16 最大并发连接数
USE_MSRPC 0 Windows 下启用 MS RPC 传输(更高兼容性)
PROGRAM_NAME bin/vlmcsd 服务端输出路径
CLIENT_NAME bin/vlmcs 客户端输出路径
MULTI_NAME bin/vlmcsdmulti 多调用二进制输出路径
STRIP 1 是否 strip 调试符号

编译示例:

# 启用 HTTPS 远程管理(需 libssl-dev)
make HAVE_SSL=1 CRYPTO=openssl

# 自定义输出名称
make PROGRAM_NAME=bin/ckmsd CLIENT_NAME=bin/ckms

# Windows x64 交叉编译
make CC=x86_64-w64-mingw32-gcc PROGRAM_NAME=bin/ckmsd.exe CLIENT_NAME=bin/ckms.exe

# Windows x86 交叉编译
make CC=i686-w64-mingw32-gcc PROGRAM_NAME=bin/ckmsd.exe CLIENT_NAME=bin/ckms.exe

# Linux i386 交叉编译
make CC=gcc CFLAGS=-m32 LDFLAGS=-m32

# Linux ARM64 交叉编译
make CC=aarch64-linux-gnu-gcc

更多 OpenSSL 与构建细节见 README.opensslREADME.compile-and-pre-built-binaries


六、配置文件

CKMS 通过 config.ini(INI 格式)统一配置扩展功能。使用 -i 指定路径,运行中发送 SIGHUP热重载

; ===============================
;  Anti-CC 防护
; ===============================
MaxRequests=20                  ; 单 IP 时间窗口内最大请求数,超出即拒绝
WindowMinutes=1                 ; 时间窗口(分钟)

; ===============================
;  远程管理
; ===============================
RemoteEnable=false              ; 启用心跳上报 + 配置同步
RemoteUrl=http://localhost/ckms/web/api/
RemoteApiKey=your-api-key       ; 认证密钥(需与 Web 后台一致)

; ===============================
;  公网 IP 发现
; ===============================
RemoteIPEnable=false            ; 启用后通过探针获取真实公网 IP(NAT 穿透)

; ===============================
;  GeoIP 过滤
; ===============================
GeoFilterEnable=false           ; 启用按国家码过滤
GeoAllowCountries=              ; 允许的国家码,逗号分隔,如 CN,US,JP

; ===============================
;  日志
; ===============================
LogEnabled=true                 ; 启用日志
LogRetentionDays=30             ; 保留天数(0 = 永久保留)
LogDir=Log                      ; 日志目录(相对程序目录)

所有字段均为可选,缺失时使用上述默认值。


七、使用方式

7.1 服务端命令行参数

参数 说明
-L <addr:port> 指定监听地址,可多次使用
-P <port> 指定默认端口(需在 -L 之前使用)
-o0|1|2|3 公网防护等级(0=无 / 1=仅私网监听 / 2=拒绝公网连接 / 3=1+2)
-i <file> 加载 INI 配置文件
-D 后台守护进程模式
-p <file> 写入 PID 文件
-s Windows 注册为系统服务
-t <sec> TCP 连接超时(默认 30 秒)
-m <n> 最大并发客户端数
-d 处理完一个请求后立即断开
-F0|1 是否允许绑定未配置的 IP(1=允许)
-x0|1 退出行为(0=尽力运行 / 1=严格退出)
-V 显示版本信息
-h 显示帮助

常用启动示例:

./ckmsd                                    # 默认监听 0.0.0.0:1688
./ckmsd -i /path/to/config.ini             # 加载 INI 配置
./ckmsd -L 192.168.1.10:1688               # 指定监听地址
./ckmsd -o1                                # 仅监听私网地址(公网不可达)
./ckmsd -o3                                # 最高防护:仅私网 + 拒绝公网
./ckmsd -D -p /var/run/ckmsd.pid           # 后台运行 + PID 文件
./ckmsd -m 100 -t 10                       # 限制 100 并发,10 秒超时
./ckmsd -h                                 # 查看全部选项

7.2 客户端调试

./ckms                                     # 测试 127.0.0.1:1688
./ckms 192.168.1.10:1688                   # 测试远端
./ckms .example.com                        # 通过 DNS SRV 自动发现
./ckms -v                                  # 详细信息
./ckms -l Windows                          # 查看可用应用清单

7.3 Windows 系统服务

ckmsd.exe -s                               :: 安装为系统服务(C:\ckmsd)

通过 services.msc 管理服务启停。

7.4 多调用二进制

通过软链接复用同一可执行文件,节省磁盘空间:

ln -s ckmsdmulti ckmsd
ln -s ckmsdmulti ckms
./ckmsdmulti vlmcsd -L 0.0.0.0:1688
./ckmsdmulti vlmcs  127.0.0.1

7.5 热重载配置

kill -HUP $(cat /var/run/ckmsd.pid)

八、Web 管理后台

8.1 部署

cp -r web /var/www/html/ckms
chown -R www-data:www-data /var/www/html/ckms/data
chmod -R 755 /var/www/html/ckms/data

访问 http://your-host/ckms/默认密码 admin123(首次登录后请立即修改)。

8.2 功能一览

模块 功能
服务器管理 添加服务器(自动生成 API Key)、在线状态、版本、地区、封禁 IP 数、重置 Key、删除
黑白名单 在线编辑白名单 / 黑名单,支持单 IP、IP 段、CIDR 子网
系统设置 时区、Anti-CC 参数、日志保留、GeoIP 过滤、心跳超时、状态页可见内容
申请管理 审批用户自助提交的白名单申请
状态页 /ckms/status.php 公开展示服务器状态(可见内容由管理员配置)

8.3 数据持久化

文件 内容
servers.json 服务器列表(名称、API Key、心跳、版本、封禁 IP)
whitelist.txt 白名单
blacklist.txt 黑名单
applications.json 白名单申请记录
admin.json 管理员密码哈希与全局配置
login_fails.json 登录失败计数(防爆破)

数据写入采用 临时文件 + rename 原子操作,写入前自动备份到 .bak。即使进程崩溃也不会丢失数据,多服务器并发心跳安全可靠。


九、远程管理与心跳

启用 RemoteEnable=true 后,ckmsd 自动与远端管理后台保持双向同步:

周期 方向 内容
每 120 秒 上报 → 心跳:版本、监听地址、封禁 IP 列表、在线状态
每 600 秒 ← 拉取 配置:白名单、黑名单、Anti-CC 参数、GeoIP 配置

认证机制

API 通过四元组鉴权,有效防止重放和未授权访问:

Header 说明
x-api-key 服务器 API Key(管理后台生成)
x-nonce 随机串(防重放)
x-timestamp 时间戳(防重放)
x-signature HMAC-SHA256(path|nonce|timestamp, api_key)

配置流程

1. Web 后台「添加服务器」 → 获得 API Key
2. 填入 config.ini 的 RemoteApiKey
3. 设置 RemoteEnable=true
4. 重启 ckmsd 或发送 SIGHUP 热重载

十、注意事项

⚠ 安全

部署后务必执行以下安全配置。

  • 修改默认密码:Web 后台默认密码 admin123,部署后立即修改
  • 保护 API KeyRemoteApiKey 等同于服务器身份凭证,切勿泄露
  • 端口管控:1688 端口暴露公网时,务必启用 Anti-CC 和白名单,防止被滥用
  • 启用 HTTPS:远程管理走 HTTP 时 API Key 以明文传输,生产环境建议 make HAVE_SSL=1 并使用 https:// 地址

⚠ 数据

  • Web 后台数据写入为原子操作(临时文件 + rename + .bak 备份),多服务器并发心跳不会丢数据
  • data/ 目录需对 Web 服务器用户可读写,建议定期备份

⚠ 编译

  • SSL 可选:默认不启用 SSL,远程管理走纯 HTTP。仅当 RemoteUrlhttps:// 时才需 make HAVE_SSL=1
  • i386 编译:需 gcc-multilib + libc6-dev-i386,使用 make CFLAGS=-m32 LDFLAGS=-m32
  • MinGW 编译:原生 PE,不依赖 Cygwin。启用 HAVE_SSL 时需额外链接 -lssl -lcrypto -lcrypt32
  • MS RPC:仅 Windows 下可用(make USE_MSRPC=1),提供与原生 KMS 更高的兼容性

⚠ 运行

  • 充值计数:KMS 服务器需达到最小客户端计数才会响应激活(Windows 25 个,Office 5 个)。可用 ckms 手动发送请求充值
  • 防火墙:确保 TCP 1688 入站放行;启用远程管理时确保 ckmsd 可访问 RemoteUrl
  • 日志磁盘:日志按天写入 LogDir,注意磁盘空间。LogRetentionDays=0 表示永久保留
  • NAT 环境RemoteIPEnable=false 时上报本地网卡 IP;服务器在 NAT 后时启用该项可上报真实公网 IP
  • 公网防护:生产环境建议使用 -o3(仅私网监听 + 拒绝公网连接),获得最高安全等级

十一、文档

man/ 目录提供完整的 man page:

文件 内容
vlmcsd.7 KMS 概念与快速上手
vlmcsd.8 ckmsd 全部命令行选项
vlmcs.1 ckms 客户端使用
vlmcsdmulti.1 多调用二进制说明
vlmcsd.ini.5 INI 配置文件语法
vlmcsd-floppy.7 floppy144.vfd 启动盘使用

十二、目录结构

ckms/
├── src/                          # 核心源码
│   ├── ckms_config.c             #   INI 配置加载 + 热重载
│   ├── ckms_acl.c                #   Anti-CC + 黑白名单
│   ├── ckms_log.c                #   按天日志 + 自动清理
│   ├── ckms_remote.c             #   心跳上报 + 配置同步
│   ├── ckms_service.c            #   Windows 系统服务
│   ├── vlmcsd.c                  #   KMS 服务端主程序
│   ├── vlmcs.c                   #   KMS 客户端主程序
│   ├── vlmcsdmulti.c             #   多调用入口
│   ├── kms.c / crypto.c          #   KMS 协议与加密
│   ├── rpc.c / msrpc-*.c         #   MS RPC 支持
│   ├── libkms.c                  #   静态库实现
│   ├── GNUmakefile               #   构建脚本
│   └── config.h                  #   编译时配置
├── man/                          # man page 源文件
├── web/                          # PHP 管理后台
│   ├── index.php                 #   管理面板
│   ├── status.php                #   公开状态页
│   └── api/                      #   REST API
│       ├── _lock.php             #     原子 JSON 读写(崩溃安全)
│       ├── heartbeat.php         #     心跳接收
│       ├── config.php            #     配置同步
│       ├── apply.php             #     白名单申请
│       ├── geo.php               #     GeoIP 解析
│       └── status.php            #     状态查询
├── ckms_dist/                    # 预编译多平台二进制
├── ckms_dist_static/             # 预编译静态链接版本
├── dist/                         # 打包输出
├── config.ini                    # CKMS 默认配置
├── GNUmakefile                   # 主构建入口
├── Makefile                      # BSD make 兼容包装
├── Dockerfile.build              # Docker 多架构构建
├── build-all.sh                  # Linux 三架构交叉编译
├── build-linux.sh                # Linux 构建脚本(开发用)
├── build-release.sh              # 全平台发布构建脚本
└── README*                       # 文档

十三、协议与致谢

  • 本项目使用 MIT 协议,详见 LICENSE
  • 核心 KMS 实现源自 vlmcsd(Hotbird64)
  • Debian / Docker 子模块分别托管在 Wind4/vlmcsd-debianWind4/vlmcsd-docker

CKMS · 由 xuanlove 维护

About

CKMS,根据vlmcsd二次开发

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages