使用CloudFlare CFSSL构建用于证书管理的私有PKI / TLS CA

这是续集。
您可以通过以下链接以PDF格式下载本文,以为我们提供支持。

以PDF格式下载指南


这是续集。

这是续集。
这是续集。

CloudFlare的PKI / TLS工具包

改编自 CFSSL GitHub页面CFSSL是CloudFlare的开源PKI / TLS瑞士军刀。它是用于TLS证书签名,验证和捆绑的命令行工具,并且还是HTTP API服务器。将正确的捆绑在一起是个坏蛋,如果做错了,它很快就会成为调试的噩梦。 CloudFlare创建了CFSSL以促进捆绑。通过选择正确的证书链,CFSSL解决了性能,安全性和兼容性之间的折衷问题。

CFSSL 公钥基础设施 不仅是捆绑证书的工具,而且还可以用作CA。这是可能的,因为它涵盖了证书创建的基本功能,例如私钥创建,证书签名请求创建和证书签名。

SSL证书和TLS的简要说明

众所周知,互联网是非常危险的地方。并非您单击的每个URL或您访问的每个站点都是Internet出售的站点。由于大型万维网的不安全特性,因此使用SSL证书来缓解其中的一些安全隐患。 SSL证书通过将域名绑定到服务器名称,将公司名称绑定到位置,并保证网站的身份,从而构成了Web上信任的核心。也就是说,证书包含服务器名称,确保证书真实性的可信证书颁发机构(CA)和服务器的公共加密密钥。

如果您经营一家公司并希望在线提供服务,那么全世界的人们唯一可以验证您的域名身份的方法就是使用由可信证书颁发机构(例如GlobalSign或DigiCert)颁发的SSL证书。是要做的。 SSL证书与传输层安全性(TLS)结合使用。没有SSL证书,则无法使用TLS加密网站流量。 TLS确保客户端(浏览器)和服务器(例如Web服务器)之间的连接如下所示:

  • 私有(或安全),因为使用对称加密来加密发送的数据
  • 发送的每条消息均包含消息完整性检查,这是可靠的,可防止数据在传输过程中丢失或被修改而不会被发现
  • 服务器通常是已知的,因为它提供来自SSL证书的标识信息(包括服务器名称,可信证书颁发机构(CA)和服务器的公共加密密钥)。

您应该知道任何人都可以创建证书(自签名证书),但是浏览器仅信任来自受信任CA列表中的组织的证书。证书颁发机构或证书颁发机构(CA)是经过严格安全审核的实体,可以颁发受信任的数字证书来验证您对网站的所有权。颁发给CA本身的证书被称为受信任的根证书,因为它们旨在在CA层次结构中建立最终的信任点。

在大多数情况下,证书是由中间CA颁发的,而不是由根CA直接颁发的。中间CA证书是由受信任的根颁发的从属证书,专门用于颁发最终实体服务器证书。结果是建立信任链,该信任链从受信任的根CA开始,经过中间,最后以颁发的最后一个SSL证书结束。因此,使用中间证书可提供更高级别的安全性,因为CA不必直接从CA根证书颁发证书。资源:Digicert KB..

SSL证书,TLS和证书颁发机构并没有太大的问题,因此现在正是探索此CFSSL工具的好时机。

CFSSL包含:

  • 一组可帮助构建自定义TLS PKI工具的软件包
  • cfssl程序,使用CFSSL软件包的合法命令行实用程序。
  • multirootca程序。这是可以使用多个签名密钥的证书颁发机构服务器。
  • mkbundle程序用于构建证书池捆绑包。
  • cfssljson程序。从cfssl和multirootca程序获取JSON输出,并将证书,密钥,CSR和捆绑包写入磁盘。

在Linux上安装CFSSL

此安装过程使用Ubuntu 20.04。要安装cfssl和其他工具(mkbundle,cfssljson,multirootca),从源代码构建时必须正确安装Go 1.12+。

安装Go

首先,请准备服务器。我正在使用Ubuntu 20.04。如下所示更新并安装gcc。

sudo apt update

安装所需的构建软件包

sudo apt install build-essential

上面的命令将安装新的软件包,例如gcc,g ++和make。

要在CentOS,Ubuntu和Linux Mint上安装Go,请单击下面的链接,然后继续安装cfssl。

在Ubuntu / CentOS上安装Go(Golang)

以下命令下载,构建和安装所有实用程序(包括cfssl,cfssljson,mkbundle等)。

go get -u github.com/cloudflare/cfssl/cmd/...

二进制程序包位于您的主目录中。

$ ls ~/go/bin/
cfssl  cfssl-bundle  cfssl-certinfo  cfssljson  cfssl-newkey  cfssl-scan  mkbundle  multirootca

如果只需要安装cfssl,请运行以下命令:

go get -u github.com/cloudflare/cfssl/cmd/cfssl

如何使用CFSSL

既然已经安装了cfssl,则可以在您的环境中使用它。

初始化证书颁发机构(CA)

为您的环境初始化根CA。首先,您需要保存默认的cfssl选项,以备将来替换和使用。

mkdir ~/cfssl
cd ~/cfssl
cfssl print-defaults config > ca-config.json
cfssl print-defaults csr > ca-csr.json

编辑生成的文件以适合您的环境

$ vim ca-csr.json

{
    "CN": "Computingforgeeks CA",
    "key": {
        "algo": "rsa",
        "size": 2048
    },
    "names": [
        {
            "C": "KE",
            "ST": "NB",
            "L": "Kenya",
            "O": "Computingforgeeks",
            "OU": "IT"
        }
    ]
}

我将创建一个中间证书,因此将其添加到下面的配置文件中的配置文件中,并在后续步骤中使用它来创建每个配置文件。中间CA概要文件具有签名,客户端身份验证,服务器身份验证,证书签名和密钥加密等功能(用法),适用于中间CA。

$ vim ca-config.json

{
  "signing": {
    "default": {
      "expiry": "8760h"
    },
    "profiles": {
      "intermediate_ca": {
        "usages": [
            "signing",
            "digital signature",
            "key encipherment",
            "cert sign",
            "crl sign",
            "server auth",
            "client auth"
        ],
        "expiry": "8760h",
        "ca_constraint": {
            "is_ca": true,
            "max_path_len": 0, 
            "max_path_len_zero": true
        }
      },
      "peer": {
        "usages": [
            "signing",
            "digital signature",
            "key encipherment", 
            "client auth",
            "server auth"
        ],
        "expiry": "8760h"
      },
      "server": {
        "usages": [
          "signing",
          "digital signing",
          "key encipherment",
          "server auth"
        ],
        "expiry": "8760h"
      },
      "client": {
        "usages": [
          "signing",
          "digital signature",
          "key encipherment", 
          "client auth"
        ],
        "expiry": "8760h"
      }
    }
  }
}

生成具有指定选项的CA

$ cfssl gencert -initca ca-csr.json | cfssljson -bare ca -

 [INFO] generating a new CA key and certificate from CSR
 [INFO] generate received request
 [INFO] received CSR
 [INFO] generating key: rsa-2048
 [INFO] encoded CSR
 [INFO] signed certificate with serial number 575514558967771581279537545623874943296973655847

在执行命令的目录中创建以下文件。它由根CA公钥(ca.pem),私钥(ca-key.pem)和证书签名请求(ca.csr)组成。私钥应尽可能安全地存储。

  • ca-key.pem
  • casr

您现在拥有最重要的文件,即根CA。根CA允许您生成中间证书。可以像CA一样使用中间证书,以生成其他中间证书或直接签署证书或密钥。

创建一个中间CA。首先,创建一个新目录来保存中间文件。

$ mkdir ~/cfssl/intermediate && cd ~/cfssl/intermediate
$ nano intermediate.json

{
  "CN": "Computingforgeeks Servers Intermediate CA",
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C":  "KE",
      "L":  "Nairobi",
      "O":  "Geeks Servers",
      "OU": "Servers Intermediate CA",
      "ST": "Kileleshwa"
    }
  ],
  "ca": {
    "expiry": "42720h"
  }
}

创建配置文件后,请创建中间公钥和私钥以及中间签名请求。

$ cfssl gencert -initca intermediate.json | cfssljson -bare intermediate_ca

 [INFO] generating a new CA key and certificate from CSR
 [INFO] generate received request
 [INFO] received CSR
 [INFO] generating key: rsa-2048
 [INFO] encoded CSR
 [INFO] signed certificate with serial number 49317059847143524717036065772346603828701272228


$ cfssl sign -ca ~/cfssl/ca.pem 
  -ca-key ~/cfssl/ca-key.pem 
  -config ~/cfssl/ca-config.json 
  -profile intermediate_ca intermediate_ca.csr | cfssljson -bare intermediate_ca

 [INFO] signed certificate with serial number 557857085402097518963872901169945507335721839653

请注意,我们使用的是之前创建的ca-config.json文件。该文件包含相应的配置文件,例如middle_ca,peer,server,client。还要注意,我们在这里使用了intermediate_ca配置文件。另外,根公共和私有密钥用于对中间私有和公共密钥进行签名。然后,您就可以使用中间CA和密钥了。此时,可以将根CA私钥加密并隐藏在非常安全的位置。

证书用法示例

假设您正在使用诸如computeexample.com之类的域名来获取Web服务器的证书。首先要做的是为您的服务器生成一个证书签名请求(CSR),类似于下面的JSON中所示。

$ nano geekscsr.json

{
  "CN": "server.computingexample.com",
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
  {
    "C": "KE",
    "L": "Nairobi",
    "O": "IT Servers",
    "OU": "Computing Webserver1",
    "ST": "Kileleshwa"
  }
  ],
  "hosts": [
    "server1.computingexample.com",
    "localhost"
  ]
}

要使用上述设置生成服务器证书:

$ cfssl gencert -ca intermediate_ca.pem -ca-key intermediate_ca-key.pem -config ~/cfssl/ca-config.json -profile=server geekscsr.json | cfssljson -bare web-server1

 [INFO] generate received request
 [INFO] received CSR
 [INFO] generating key: rsa-2048 
 [INFO] encoded CSR
 [INFO] signed certificate with serial number 548472281222429688545698573045498525083615863345

确保您在运行命令的目录中具有middle_ca.pem geekscsr.json和medium_ca-key.pem文件。

上面的命令将生成以下证书文件:

  • 网络服务器1.csr
  • web-server1-key.pem
  • web-server1.pem

证书包

mkbundle用于构建用于证书验证的根捆绑包和中间捆绑包。基本上,您将最终证书与中间CA和根CA公共密钥链接在一起。如果您决定不从头开始安装所有内容,则可以按以下方式安装mkbundle:

go get -u github.com/cloudflare/cfssl/cmd/mkbundle

它收集证书,检查CRL吊销(计划在下一发行版中提供OCSP支持)和过期的证书,并将它们捆绑到一个文件中。获取证书和证书文件的目录(其中可能包含多个证书)。例如,如果您的中间目录包含一些中间证书,请运行以下命令:

mkbundle -f bundle.crt intermediates

要捆绑证书,请确保根CA公共密钥(ca.pem)和中间公共密钥在同一目录中。我所有人都复制到中间目录。根据以上规则捆绑生成的证书。

##Copy Root CA Public and Intermediate CA public keys into the intermediate directory
$ cp ~/cfssl/ca.pem ~/cfssl/intermediate
$ cd ~/cfssl
$ mkbundle -f web-server1.crt intermediate

 [INFO] Found intermediate
 [INFO] Found intermediate/ca.pem
 [INFO] Loading intermediate/ca.pem
 [INFO] Validating CN=Computingforgeeks CA,OU=IT,O=Computingforgeeks,L=Kenya,ST=NB,C=KE
 [INFO] Found intermediate/intermediate_ca-key.pem
 [INFO] Loading intermediate/intermediate.json
 Loading intermediate/intermediate_ca-key.pem
 Skipping non-certificate
 [INFO] Found intermediate/intermediate_ca.csr
 [INFO] Found intermediate/intermediate_ca.pem
 [INFO] Loading intermediate/intermediate_ca.csr
 [INFO] Skipping non-certificate
 [INFO] Loading intermediate/intermediate_ca.pem
 [INFO] Validating CN=Computingforgeeks Servers Intermediate CA,OU=Servers Intermediate CA,O=Geeks Servers,L=Nairobi,ST=Kileleshwa,C=KE
 [INFO] Found intermediate/web-server1-key.pem
 [INFO] Found intermediate/web-server1.csr
 [INFO] Found intermediate/web-server1.pem
 [INFO] Loading intermediate/web-server1-key.pem
 [INFO] Skipping non-certificate
 [INFO] Loading intermediate/web-server1.csr
 [INFO] Skipping non-certificate
 [INFO] Loading intermediate/web-server1.pem
 [INFO] Validating CN=server.computingexample.com,OU=Computing Webserver1,O=IT Servers,L=Nairobi,ST=Kileleshwa,C=KE
 [INFO] Wrote 3 certificates.

上面的命令将在当前目录中生成一个web-server1.crt文件。现在,您可以将证书复制并捆绑到服务器的已知证书目录中。

cd ~/cfssl/
sudo cp web-server1.crt /etc/ssl/certs/
cd ~/cfssl/intermediate
sudo cp web-server1-key.pem web-server1.pem /etc/ssl/certs/

证书测试

要测试生成的证书,请安装Apache并将证书路径添加到配置文件。

sudo apt install apache2

##Enable ssl

sudo a2enmod ssl

使用SSL证书配置服务器

创建一个配置文件。

$ sudo vim /etc/apache2/sites-enabled/server1_computingexample_com.conf


        
                ServerAdmin [email protected]
                ServerName server1.computingexample.com

                DocumentRoot /var/www/html
                ErrorLog ${APACHE_LOG_DIR}/error.log
                CustomLog ${APACHE_LOG_DIR}/access.log combined
                SSLEngine on

                ## HERE ARE OUR GENERATED CERTS!!
                SSLCertificateFile      /etc/ssl/certs/web-server1.pem  
                SSLCertificateKeyFile /etc/ssl/certs/web-server1-key.pem
                SSLCertificateChainFile /etc/ssl/certs/web-server1.crt
                
                                SSLOptions +StdEnvVars
                
                
                                SSLOptions +StdEnvVars
                
        

将样本index.html文件添加到DocumentRoot / var / www / html /

cd /var/www/html/
sudo vim index.html



  
    
    
    
    
 
    Test SSL
  
  

    

Our Test Page has Loaded

重新启动apache并查看页面是否使用https协议加载

sudo systemctl restart apache2

访问网络服务器

如果您有DNS,则可以将FQDN映射到IP,并使用域名直接从浏览器中加载它。对我来说,它使用带有https协议的IP进行加载

https://IP/

从上面的屏幕快照中可以看到,证书的颁发者是在教程的第一部分中配置的中间CA,而根CA是您首先创建的证书。要使根CA证书在您的环境中受信任,可以将根CA证书添加到Windows或所用平台上的受信任密钥中。

学习安全性的最佳课程:


信息安全意识-ISO 27001:2013-COVID19更新

信息安全意识-ISO 27001:2013-COVID19更新

★★★★☆
(11741)

$ 15.68

$ 83.97

有现货

立即购买

使用CloudFlare CFSSL构建用于证书管理的私有PKI / TLS CAUdemy.com


完整的网络安全课程:黑客暴露!

完整的网络安全课程:黑客暴露!

★★★★☆
(28305)

$ 21.28

$ 134.36

有现货

立即购买

使用CloudFlare CFSSL构建用于证书管理的私有PKI / TLS CAUdemy.com


从头开始学习道德黑客

从头开始学习道德黑客

★★★★★
(76828)

$ 19.04

$ 218.35

有现货

立即购买

使用CloudFlare CFSSL构建用于证书管理的私有PKI / TLS CAUdemy.com

结论

带有CFSSL的PKI运行正常。您可以修改并使用它来设置完整的PKI,尤其是在Kubernetes集群中时。在其他所有情况下,请注意安全。

其他有趣的指南:

使用Podman设置Docker容器注册表并加密SSL

使用“让我们加密SSL”证书在Ubuntu 20.04 / 18.04上安装Mastodon

如何在IIS Web服务器上安装SSL证书

如何使用OpenSSL检查SSL证书的到期日期

这是续集。
您可以通过以下链接以PDF格式下载本文,以为我们提供支持。

以PDF格式下载指南


这是续集。

这是续集。
这是续集。

Sidebar