使用Ansible生成OpenSSL自签名证书

时间:2020-02-23 14:29:38  来源:igfitidea点击:

OpenSSL是一种强大,商业级和全功能的工具包,用于传输层安全(TLS)和安全套接字层(SSL)协议。
它是一个为应用程序提供加密协议的库。
在Linux机器上生成自签名证书的过程可能是挑战,特别是新的Linux用户。
考虑到这可能是经常要求,需要自动化证书生成。
在今天的教程中,我将通过在Linux机器上使用Ansible生成自签名SSL证书的过程。

使用OpenSSL时,公钥源自相应的私钥。
第一步将始终使用特定算法生成私钥。
对于生产使用,将有一个证书颁发机构(CA),负责签署互联网信任的证书。
由于这是用于DEV和LAB使用情况的意思,我们正在生成一个自签名证书。

生成openssl自签名证书与issible

在本文中所示的示例中,私钥被称为hostname_privkey.pem,证书文件是hostname_fullchain.pem和csr文件是hostname.csr,其中hostname是主机名是生成证书的实际DNS。

在你开始之前

在开始之前,我们可以在本地计算机中安装ANSE。

--- Install Ansible on Fedora --
$sudo dnf install ansible
--- Install Ansible on CentOS 8/CentOS 7 --
$sudo yum -y install epel-release
$sudo yum install ansible
--- Install Ansible on Ubuntu --
$sudo apt update
$sudo apt install software-properties-common
$sudo apt-add-repository --yes --update ppa:ansible/ansible
$sudo apt install ansible
--- Install Ansible on Debian --
$echo "deb http://ppa.launchpad.net/ansible/ansible/ubuntu trusty main" | sudo tee -a /etc/apt/sources.list
$sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 93C4A3FD7BB9C367
$sudo apt update
$sudo apt install ansible
--- Install Ansible on Arch Linux --
$pacman -S ansible

通过检查版本确认Ansible安装。

$ansible --version
ansible --version
ansible 2.9.11
  config file = None
  configured module search path = ['/Users/jkmutai/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/local/Cellar/ansible/2.9.11/libexec/lib/python3.8/site-packages/ansible
  executable location = /usr/local/bin/ansible
  python version = 3.8.5 (default, May 21 2017, 10:48:26) [Clang 11.0.3 (clang-1103.0.32.62)]

安装依赖项

用ASSIble生成键和证书所必需的Pyopenssl。

--- Install with pip2 --
$sudo pip install pyOpenSSL
--- Install with pip3 --
$sudo pip3 install pyOpenSSL

如果我们是PIP检查文件的新消息。

为自签名证书生成编写Ansible Playbook

使用依赖性安装,我们应该乘车来使用Ansible生成自签名证书。
我们将为私钥,CSR和证书生成提供一个具有任务的单一播放簿。
我将把每个函数覆盖为块,然后后来我们将结合使用一个运行的剧本。

创建项目文件夹:

$mkdir -p ~/projects/ansible/{certificates,files,templates}
$cd ~/projects/
$tree
.
`-- ansible
    |-- certificates
    |-- files
    `-- templates
4 directories, 0 files

创建PlayBook架构。

$vim ~/projects/ansible/openssl_certificates.yml

添加以下标准部分。

--
- hosts: localhost
  vars:

生成带有Ansible的OpenSSL私钥

添加任务以生成私钥。
我们正在使用openssl_privatekey模块来生成openssl私钥。
此模块可以以PEM格式生成RSA,DSA,ECC或者EDDSA私钥。
如果我们不希望在RERUN上的键重新生成,则不应更改Passphrase和keysize等选项。

我们可以使用命令获取此模块的文档:

$ansible-doc openssl_privatekey

我将使用的选项是:密钥大小:4096位点类型:RSABACKUP:是的

如果是我们想要的东西,我们可以选择为键设置密码。

cd ~/projects/ansible/
vim openssl_certificates.yml

这就是我的私钥生成任务的样子。

--
- hosts: localhost
  vars:
    - server_hostname: theitroad.com
    - key_size: 4096
    - passphrase: # Set if you want passphrase
    - key_type: DSA # Others include DSA, ECC, Ed25519, Ed448, X25519, X448
  tasks:
    - name: Generate an OpenSSL private key
      openssl_privatekey:
        path: "./certificates/{{ server_hostname }}_privkey.pem"
        size: "{{ key_size }}"
        type: "{{ key_type }}"
        backup: yes

运行PlayBook for Birth键生成。

$ansible-playbook openssl_certificates.yml
PLAY [localhost] ** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ***
TASK [Gathering Facts] ** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** *****
ok: [localhost]
TASK [Generate an OpenSSL private key] ** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** *****
changed: [localhost]
PLAY RECAP ** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** *****
localhost                  : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

确认关键代。

$ls certificates/
theitroad.com_privkey.pem

使用Ansible生成OpenSSL CSR

我们添加的下一个任务是为了生成OpenSSL证书签名请求(CSR)。
这可用于请求经过认证的CA签名。
openssl_csr的模块用于此操作。

此Ansible模块支持优雅的名称,keyusage,ExtendedKeysage,BasicConstraints和OCSP必须是Staple Extensions。

这些是我将使用的选项:common_name:证书签名请求主题的CountryName字段.privateKey_Path:私有键在签名证书签名请求时使用的路径.path:生成的openssl的文件的名称证书签名请求将写入.country_name:colored签名请求主题的CountryName字段.email_address:证书签名请求主题的EmailAddress字段证书签名请求主题。

这就是更新的PlayBook文件的样子。

$cat openssl_certificates.yml
--
- hosts: localhost
  vars:
    - server_hostname: theitroad.com
    - key_size: 4096
    - passphrase: # Set if you want passphrase
    - key_type: RSA # Others include DSA, ECC, Ed25519, Ed448, X25519, X448
    - country_name: KE
    - email_address: Hyman@theitroad
    - organization_name: theitroad
  tasks:
    - name: Generate an OpenSSL private key
      openssl_privatekey:
        path: "./certificates/{{ server_hostname }}_privkey.pem"
        size: "{{ key_size }}"
        type: "{{ key_type }}"
        backup: yes
    - name: Generate an OpenSSL Certificate Signing Request with Subject information
      openssl_csr:
        path: "./certificates/{{ server_hostname }}.csr"
        privatekey_path: "./certificates/{{ server_hostname }}_privkey.pem"
        country_name: "{{ country_name }}"
        organization_name: "{{ organization_name }}"
        email_address: "{{ email_address }}"
        common_name: "{{ server_hostname }}"

在执行前检查PlayBook语法:

$ansible-playbook --syntax-check openssl_certificates.yml
playbook: openssl_certificates.yml

使用Ansible生成OpenSSL证书

openssl_certificate ansible模块用于生成openssl证书。
该模块实现了提供者的概念(即。 selfsignedowncaacmeassertonlyentrust)为证书。

我们将产生自签名证书,但我们可以使用其他提供商。

这是我更新的playbook内容:

--
- hosts: localhost
  vars:
    - server_hostname: theitroad.com
    - key_size: 4096
    - passphrase: # Set if you want passphrase
    - key_type: RSA # Others include DSA, ECC, Ed25519, Ed448, X25519, X448
    - country_name: KE
    - email_address: Hyman@theitroad
    - organization_name: theitroad
  tasks:
    - name: Generate an OpenSSL private key
      openssl_privatekey:
        path: "./certificates/{{ server_hostname }}_privkey.pem"
        size: "{{ key_size }}"
        type: "{{ key_type }}"
        backup: yes
    - name: Generate an OpenSSL Certificate Signing Request with Subject information
      openssl_csr:
        path: "./certificates/{{ server_hostname }}.csr"
        privatekey_path: "./certificates/{{ server_hostname }}_privkey.pem"
        country_name: "{{ country_name }}"
        organization_name: "{{ organization_name }}"
        email_address: "{{ email_address }}"
        common_name: "{{ server_hostname }}"
    - name: Generate a Self Signed OpenSSL certificate
      openssl_certificate:
        path: "./certificates/{{ server_hostname }}_cert.pem"
        privatekey_path: "./certificates/{{ server_hostname }}_privkey.pem"
        csr_path: "./certificates/{{ server_hostname }}.csr"
        provider: selfsigned

最后,我们将验证语法和执行PlayBook以生成证书。

$ansible-playbook --syntax-check openssl_certificates.yml
playbook: openssl_certificates.yml

运行剧本。

$ansible-playbook openssl_certificates.yml

执行

PLAY [localhost] ** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ***
TASK [Gathering Facts] ** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** *****
ok: [localhost]
TASK [Generate an OpenSSL private key] ** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** *****
changed: [localhost]
TASK [Generate an OpenSSL Certificate Signing Request with Subject information] ** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
changed: [localhost]
TASK [Generate a Self Signed OpenSSL certificate] ** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **
changed: [localhost]
PLAY RECAP ** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** *****
localhost                  : ok=4    changed=3    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

列出文件以检查创建的文件。

$tree certificates/
certificates/
|-- theitroad.com.csr
|-- theitroad.com_cert.pem
|-- theitroad.com_privkey.pem
`-- Hyman@theitroad:39:50~
0 directories, 4 files

我们可以使用openssl命令查看证书信息。

$openssl x509 -in certificates/theitroad.com_cert.pem -text
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            49:90:1b:9a:7c:24:c1:d2:7e:b4:ba:70:66:46:cb:e9:52:63:ae:f9
    Signature Algorithm: sha256WithRSAEncryption
        Issuer: C=KE, O=theitroad, CN=theitroad.com/emailHyman@theitroad
        Validity
            Not Before: Sep  9 21:39:52 2017 GMT
            Not After : Sep  7 21:39:52 2030 GMT
        Subject: C=KE, O=theitroad, CN=theitroad.com/Hyman@theitroad
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (4096 bit)
                Modulus:
                    00:d8:82:6e:d9:c6:1d:7d:86:0b:96:37:5e:6c:78:
                    ae:00:a2:73:cd:1c:2c:31:69:0f:f0:2e:c7:db:e5:
                    77:71:09:32:72:33:85:26:84:7a:6d:07:7e:ed:a6:
                    6c:ef:87:fa:3e:a4:a7:5a:b5:5a:91:b0:74:f1:3d:
                    cd:d6:a5:48:22:b2:84:df:6e:bd:65:df:5b:6c:a4:
                    62:36:23:a1:c7:5c:b1:18:1e:9f:2a:99:d0:2a:08:
                    5d:b1:39
                Exponent: 65537 (0x10001)
        X509v3 extensions:
            X509v3 Subject Alternative Name:
                DNS:theitroad.com
            X509v3 Subject Key Identifier:
                61:1D:2F:F8:CC:9F:86:65:07:C9:9A:0E:07:6C:97:A5:30:96:A5:0D
    Signature Algorithm: sha256WithRSAEncryption
         84:49:cd:dd:2d:7c:5e:02:b1:3c:96:36:a8:79:2a:b4:f4:dc:
         ae:63:84:31:86:de:bf:e5:f0:f4:30:84:f1:8f:99:31:c1:d6:
         72:4c:74:a1:b6:bd:3e:4f:9a:01:91:3f:58:51:d6:23:36:a9:
         ae:ed:84:5d:ce:96:c5:3b:0b:06:50:81:85:be:1e:eb:66:dd:
         a4:d2:98:41:50:55:1c:d4
-----BEGIN CERTIFICATE----
MIIFuzCCA6OgAwIBAgIUSZAbmnwkwdJ+tLpwZkbL6VJjrvkwDQYJKoZIhvcNAQEL
BQAwdTELMAkGA1UEBhMCS0UxGjAYBgNVBAoMEUNvbXB1dGluZ2ZvcmdlZWtzMR4w
HAYDVQQDDBVjb21wdXRpbmdmb3JnZWVrcy5jb20xKjAoBgkqhkiG9w0BCQEWG2Fk
bWluQGNvbXB1dGluZ2ZvcmdlZWtzLmNvbTAeFw0yMDA5MDkyMTM5NTJaFw0zMDA5
igjoxiENbYX8iRAxj+F7x3eyMvwMshNqwxioVIBcVEmYGQnRiFEN3yn348KWE9z6
FQuOTHmaAIyKb02WEuMqE+Rw1D4zcNMfgWeihZALmfwUy0Hyi2S1UThjHOKjwp4u
6Y6G13Wrf+emErflPRRKbmVlwv3Jf7/ujGG3HfcqIgA0OFxyTHShtr0+T5oBkT9Y
UdYjNqmu7YRdzpbFOwsGUIGFvh7rZt2k0phBUFUc1A==
-----END CERTIFICATE----

使用OpenSSL键和证书生成,我们可以开始使用应用程序使用它。
对于根CA签名提供生成的CSR。