使用Ansible生成OpenSSL自签名证书
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证书。
该模块实现了提供者的概念(即。 selfsigned
那 ownca
那 acme
那 assertonly
那 entrust
)为证书。
我们将产生自签名证书,但我们可以使用其他提供商。
这是我更新的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。