使用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。

