快速部署的KMS服务,提供针对Windows和Office的激活服务

Overview

KMS服务器

快速部署的KMS服务器,提供针对Windows和Office的激活服务,同时内置了各个版本的激活密钥与命令,支持Docker容器化部署,在Docker HubGithub Package可以查看已构建的镜像。

使用方法

kms.343.re 为例,在成功部署KMS服务以后,你可以通过网页或者命令行获取激活密钥。

# 输出操作说明
shell> curl kms.343.re

# 输出Windows的KMS密钥
shell> curl kms.343.re/win

# 输出Windows Server的KMS密钥
shell> curl kms.343.re/win-server

# 输出Office激活说明
shell> curl kms.343.re/office

# 测试其他KMS服务器是否正常
shell> curl "kms.343.re/check?host=kms.dnomd343.top&port=1688"

部署完成后,需要KMS服务的地方填入 kms.343.re 即可激活。

镜像获取

kms-server 可以从多个镜像源拉取,其数据完全相同,国内用户建议首选阿里云镜像。

# Docker Hub
shell> docker pull docker.io/dnomd343/kms-server

# Github Package
shell> docker pull ghcr.io/dnomd343/kms-server

# 阿里云个人镜像
shell> docker pull registry.cn-shenzhen.aliyuncs.com/dnomd343/kms-server

镜像对外暴露 1688/tcp1689/tcp 端口,前者用于KMS激活服务,后者用于获取KMS激活密钥。

部署流程

检查防火墙

服务器的1688端口必须能接受来自外网的访问,务必检查是否被防火墙拦截。

如果开启了 firewalld 防火墙服务,使用以下命令放行1688端口

shell> firewall-cmd --zone=public --add-port=1688/tcp --permanent
shell> firewall-cmd --reload
shell> firewall-cmd --list-ports

如果开启了 ufw 防火墙服务,使用以下命令放行1688端口

shell> ufw allow 1688/tcp
shell> ufw status

一些云服务商可能会在网页端控制台提供防火墙服务,请在对应页面开放 1688/tcp 端口。

Docker方式(推荐)

1. 配置Docker环境

使用以下命令确认Docker环境

# 若正常输出则跳过本步
shell> docker --version
···Docker版本信息···

使用以下命令安装Docker

# RH系
shell> sudo yum update
···
# Debian系
shell> sudo apt update && sudo apt upgrade
···
# 使用Docker官方脚本安装
shell> sudo wget -qO- https://get.docker.com/ | bash
···
# 安装成功后将输出Docker版本信息
shell> docker --version
Docker version ···, build ···

2. 启动KMS服务

启动容器并映射端口

# 映射容器1688与1689端口到宿主机,容器路径可替换为上述其他源
shell> docker run -d --name kms -p 1688:1688 -p 1689:1689 dnomd343/kms-server
# 查看容器状态
shell> docker ps -a
CONTAINER ID   IMAGE                    COMMAND           CREATED          STATUS        PORTS     NAMES
···

若服务器1689端口未配置防火墙,在浏览器输入 http://服务器IP:1689/ 即可访问Web主页。

# 测试容器是否正常工作
shell> curl 127.0.0.1:1689/win
···不同版本Windows的KMS密钥···

3. 配置反向代理

将用于KMS服务的域名DNS解析到当前服务器,这里使用Nginx作为示例,其他Web服务原理类似。

# 进入Nginx配置目录
shell> cd /etc/nginx/conf.d
# 下载配置文件
shell> wget https://raw.githubusercontent.com/dnomd343/kms-server/master/conf/nginx/docker.conf -O kms.conf
# 修改配置文件中域名、证书、端口等信息
shell> vim kms.conf

如果你的网络无法正常访问Github,将下述内容写入配置文件亦可。

server {
    listen 80;
    listen [::]:80;
    server_name kms.343.re; # 改为自己的域名
    location / {
        if ($http_user_agent !~* (curl|wget)) {
            return 301 https://$server_name$request_uri;
        }
        proxy_set_header Host $http_host;
        proxy_pass http://127.0.0.1:1689;
    }
}

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name kms.343.re; # 改为自己的域名
    ssl_certificate /etc/ssl/certs/343.re/fullchain.pem; # 改为自己的证书
    ssl_certificate_key /etc/ssl/certs/343.re/privkey.pem;
    
    gzip on;
    gzip_buffers 32 4K;
    gzip_comp_level 6;
    gzip_min_length 100;
    gzip_types application/javascript text/css text/xml;
    gzip_disable "MSIE [1-6]\.";
    gzip_vary on;

    location / {
        proxy_set_header Host $http_host;
        proxy_pass http://127.0.0.1:1689;
    }
}

重启Nginx服务

shell> nginx -s reload

常规方式(不推荐)

此方式较为繁琐且可能存在版本兼容问题,不熟悉Linux操作的用户建议使用上述Docker方式。

1. 拉取源码

首先拉取仓库到服务器上,这里以 /var/www/kms-server 为例

shell> cd /var/www
shell> git clone https://github.com/dnomd343/kms-server.git
Cloning into 'kms-server'...
···
Unpacking objects: 100% ··· done.

2. 环境检查

确定你的服务器上有PHP环境,同时有 curl 工具

shell> php -v
···PHP版本信息···

shell> curl --version
···curl版本信息···

确认PHP-FPM正常运行

shell> systemctl | grep fpm
  php7.3-fpm.service            loaded active running   The PHP 7.3 FastCGI Process Manager

3. 配置Web服务

配置网页服务器代理,需要额外占用除80与443之外的一个端口,默认为 1689/tcp ,可按需修改。

将用于KMS服务的域名DNS解析到当前服务器,这里使用Nginx作为示例,其他Web服务原理类似。

# 进入nginx配置目录
shell> cd /etc/nginx/conf.d

# 从代码仓库复制配置文件
shell> cp /var/www/kms-server/conf/nginx/kms.conf ./

# 修改配置文件中域名、证书、端口等信息
shell> vim kms.conf

配置文件内容如下

server {
    listen 80;
    listen [::]:80;
    server_name kms.343.re; # 改为自己的域名
    location / {
        if ($http_user_agent !~* (curl|wget)) {
            return 301 https://$server_name$request_uri;
        }
        proxy_set_header Host $http_host;
        proxy_pass http://127.0.0.1:1689;
    }
}

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name kms.343.re; # 改为自己的域名
    ssl_certificate /etc/ssl/certs/343.re/fullchain.pem; # 改为自己的证书
    ssl_certificate_key /etc/ssl/certs/343.re/privkey.pem;
    
    gzip on;
    gzip_buffers 32 4K;
    gzip_comp_level 6;
    gzip_min_length 100;
    gzip_types application/javascript text/css text/xml;
    gzip_disable "MSIE [1-6]\.";
    gzip_vary on;

    location / {
        proxy_set_header Host $http_host;
        proxy_pass http://127.0.0.1:1689;
    }
}

server {
    listen 1689;
    root /var/www/kms-server;

    location / {
        set $query_param $query_string;
        if ($http_user_agent ~* (curl|wget)) {
            set $query_param $query_param&cli=true;
        }
        include fastcgi_params;
        fastcgi_pass 127.0.0.1:9000; # php-fpm接口
        fastcgi_param QUERY_STRING $query_param;
        fastcgi_param SCRIPT_FILENAME /var/www/kms-server/backend/route.php;
    }

    location /assets {}
}

其中PHP-FPM接口在各系统上不同

# RH系一般为本地9000端口
shell> netstat -tlnp | grep 9000
tcp        0      0 127.0.0.1:9000          0.0.0.0:*               LISTEN      783/php-fpm: master
# Debian系一般为sock方式
shell> ls /var/run/php/
php7.3-fpm.pid  php7.3-fpm.sock

对应Nginx配置如下

# RH系
fastcgi_pass 127.0.0.1:9000;
# Debian系
fastcgi_pass unix:/var/run/php/php7.3-fpm.sock;

重启Nginx服务

shell> nginx -s reload

测试服务是否正常工作

shell> curl 127.0.0.1:1689/win
···不同版本WindowsKMS密钥···

4. 配置vlmcsd服务

在vlmcsd的Github页面获取最新release包。

# 下载最新release并解压
shell> wget https://github.com/Wind4/vlmcsd/releases/download/svn1113/binaries.tar.gz
shell> tar xf binaries.tar.gz

# 不同架构主机选择不同文件,以下为常见示例
# x86-64架构
shell> cp binaries/Linux/intel/static/vlmcsd-x64-musl-static /usr/bin/vlmcsd
shell> cp binaries/Linux/intel/static/vlmcs-x64-musl-static /usr/bin/vlmcs
# x86架构
shell> cp binaries/Linux/intel/static/vlmcsd-x86-musl-static /usr/bin/vlmcsd
shell> cp binaries/Linux/intel/static/vlmcs-x86-musl-static /usr/bin/vlmcs
# arm架构
shell> cp binaries/Linux/arm/little-endian/static/vlmcsd-armv7el-uclibc-static /usr/bin/vlmcsd
shell> cp binaries/Linux/arm/little-endian/static/vlmcs-armv7el-uclibc-static /usr/bin/vlmcs

确认是否正确安装

shell> vlmcsd -V
···vlmcsd版本信息···
shell> vlmcs -V
···vlmcs版本信息···

将vlmcsd配置为系统服务

shell> cp /var/www/kms-server/conf/vlmcsd.service /etc/systemd/system/

vlmcsd.service 文件内容如下,可按需要修改

[Unit]
Description=KMS Server By vlmcsd
After=network.target

[Service]
Type=forking
PIDFile=/var/run/vlmcsd.pid
ExecStart=/usr/bin/vlmcsd -p /var/run/vlmcsd.pid
ExecStop=/bin/kill -HUP $MAINPID
PrivateTmp=true

[Install]
WantedBy=multi-user.target

载入systemctl服务

shell> systemctl daemon-reload
shell> systemctl enable vlmcsd
shell> systemctl start vlmcsd
shell> systemctl status vlmcsd
···
Active: active (running) ···
···

开发相关

JSON接口

kms-server 预留了以下JSON接口,用于输出内置的KMS密钥。

  • /win/json:输出各版本Windows的KMS密钥;

  • /win-server/json:输出各版本Windows Server的KMS密钥;

  • /json:输出各版本Windows和Windows Server的KMS密钥;

KMS测试

kms-server 内置了检测其他KMS服务器是否可用的功能,接口位于 /check 下,使用时指定目标服务器以下参数

  • host:服务器IPv4、IPv6地址或域名

  • port:KMS服务端口,默认1688

  • site:KMS请求中的 workstation 参数,可选

curl "kms.343.re/check?host=kms.dnomd343.top&port=8861" {"status":"error","message":"connect fail"} ">
shell> curl "kms.343.re/check?host=47.242.30.65"
{"status":"ok","message":"success"}

shell> curl "kms.343.re/check?host=kms.dnomd343.top&port=8861"
{"status":"error","message":"connect fail"}

容器构建

本地构建

# 克隆仓库
shell> git clone https://github.com/dnomd343/kms-server.git
shell> cd kms-server
# 构建镜像
shell> docker build -t kms-server .

交叉构建

# 构建并推送至Docker Hub
shell> docker buildx build -t dnomd343/kms-server --platform="linux/amd64,linux/arm64,linux/386,linux/arm/v7" https://github.com/dnomd343/kms-server.git#master --push

许可证

MIT ©2021 @dnomd343

You might also like...
Comments
  • adding more info to container logs

    adding more info to container logs

    hello, in order to get more info on for which software ePID is sent you can add one more step to dockerfile in order to get vlmcsd.kmd file.

    2021-08-04 18:55:22: Sending ePID (randomized at program start): 55041-00206-682-152527-03-1061-6002.0000-0282019, 2021-08-04 18:55:22: KMS v6.0 request from T-----1 for Office Professional Plus 2019

    FROM alpine as iconv
    COPY ./conf/docker/iconv.sh /
    RUN sh /iconv.sh
    
    FROM alpine as vlmcsd
    COPY ./conf/docker/vlmcsd.sh /
    RUN apk --update add --no-cache curl wget && \
        sh /vlmcsd.sh
    
    FROM alpine as vlmcsdinfo
    WORKDIR /
    RUN apk --update add --no-cache curl wget git && \
        git clone https://github.com/Wind4/vlmcsd/
    
    FROM alpine
    LABEL maintainer="dnomd343"
    COPY . /var/www/kms-server
    COPY --from=iconv /tmp/iconv/ /usr/local/lib/
    COPY --from=vlmcsd /tmp/vlmcsd/vlmcsd /usr/bin/vlmcsd
    COPY --from=vlmcsdinfo /vlmcsd/etc/vlmcsd.kmd /usr/bin/vlmcsd.kmd
    RUN apk --update add --no-cache nginx curl php7 php7-fpm php7-json php7-iconv php7-sqlite3 && \
        rm /usr/lib/php7/modules/iconv.so && ln -s /usr/local/lib/iconv.so /usr/lib/php7/modules/ && \
        mv /usr/local/lib/libiconv.so /usr/local/lib/libiconv.so.2 && \
        mkdir -p /run/nginx && touch /run/nginx/nginx.pid && \
        cp /var/www/kms-server/conf/docker/init.sh / && \
        cp /var/www/kms-server/conf/docker/kms.conf /etc/nginx/kms.conf && \
        cp -f /var/www/kms-server/conf/docker/nginx.conf /etc/nginx/nginx.conf && \
        cp /var/www/kms-server/conf/docker/init.sh /
    EXPOSE 1688 1689
    CMD ["sh","init.sh"]
    
    enhancement 
    opened by ofsahin 2
Owner
Dnomd343
Have a nice day!
Dnomd343