1

我前段时间想知道如何为 cname 创建一个 ssl 证书。这是因为我们总是为我们的虚拟机使用通用的 a 记录。用户应通过 SSL 上的服务名称访问在这些虚拟机上运行的服务。我们使用 FreeIPA 作为我们的证书颁发机构。

4

2 回答 2

4

有时您搜索了很长时间的答案,并在多个不太清楚的网站上找到了答案。我将通过一个示例来解释我的答案,以展示从 FreeIPA 请求带有cname 和带 cname 的证书的区别。

我们制作了一个虚构的虚拟机,其 a-record 为 abc955-xy.example.com。在这台机器上,我们将运行 postgres。因此,为方便起见,cname 将是 postgresql.example.com。首先我们为 abc955-xy.example.com 创建一个证书,它只对 fqdn 有效。其次,我们为cname创建一个证书,它对fqdn也有效。

没有 cname 的证书

# Generate a private key
openssl genrsa -out abc955-xy.example.com.key 4096

# Add the host to FreeIPA
ipa host-add abc955-xy.example.com --force

# Create a host principal for the service HTTP
ipa service-add HTTP/abc955-xy.example.com

# Add the host principal to the host
ipa service-add-host HTTP/abc955-xy.example.com --host abc955-xy.example.com

# Request a certificate for the host, using the principal and private key
ipa-getcert request -r -f abc955-xy.example.com.crt -k abc955-xy.example.com.key \ 
-K HTTP/abc955-xy.example.com -D abc955-xy.example.com

包含 cname 的证书

# Generate a private key
openssl genrsa -out postgresql.example.com.key 4096

# Add the host to FreeIPA, using the cname
ipa host-add postgresql.example.com --force

# Create a host principal for the service HTTP
ipa service-add HTTP/abc955-xy.example.com

# Create a principal for the service HTTP with the cname
ipa service-add HTTP/postgresql.example.com --force

# Add the cname principal to the host
ipa service-add-host HTTP/postgresql.example.com --host abc955-xy.example.com

# Request a certificate for the host, using the principal and private key and cname
ipa-getcert request -r -f postgresql.example.com.crt -k postgresql.example.com.key\
-K HTTP/postgresql.example.com -D postgresql.example.com -D abc955-xy.example.com

除了一些命名差异之外,这两个选项之间的主要区别在于您将带有 cname 的 HTTP-principal 添加到主机而不是带有 fqdn 的 HTTP-principal。

注意:由于 Chrome 和 Chromium 等浏览器从 65 版起只接受具有主题备用名称 (SAN) 的证书,因此您还需要将主题备用名称添加到没有 cname 的证书中。这就是 ipa-getcert 请求中选项 -D 的来源。对于没有 cname 的证书,您必须提供 fqdn。

于 2018-12-18T16:48:56.500 回答
-1
# Set variables
DOMAIN=domain.name
CNAME=cname
DEST_MACHINE=dest-machine

# Add CNAME DNS-record
# $CNAME => $DEST_MACHINE
ipa dnsrecord-add $DOMAIN $CNAME --cname-hostname=$DEST_MACHINE

# Generate a private key
## to /etc/pki/tls/private
## or another dir (*selinux fcontext* of that dir should be *cert_t*)
sudo openssl genrsa -out /etc/pki/tls/private/$CNAME\_$DEST_MACHINE.key 4096

# Create HTTP service for $DEST_MACHINE\.$DOMAIN
ipa service-add HTTP/$DEST_MACHINE\.$DOMAIN

# Add alias HTTP/$CNAME\.$DOMAIN for HTTP/$DEST_MACHINE\.$DOMAIN
ipa service-add-principal HTTP/$DEST_MACHINE\.$DOMAIN HTTP/$CNAME\.$DOMAIN

# Request a certificate for HTTP/$DEST_MACHINE\.$DOMAIN
# for a DNSNAMEs:
## $DEST_MACHINE\.$DOMAIN
## $CNAME\.$DOMAIN
sudo ipa-getcert request -r \
-f /etc/pki/tls/private/$CNAME\_$DEST_MACHINE.crt \
-k /etc/pki/tls/private/$CNAME\_$DEST_MACHINE.key \
-K HTTP/$DEST_MACHINE\.$DOMAIN \
-D $DEST_MACHINE\.$DOMAIN \
-D $CNAME\.$DOMAIN

# Show info about certificate requests
sudo ipa-getcert list

# List content of certificates dir
ls /etc/pki/tls/private/

# Now just use that certificates with your web-services
于 2020-01-16T11:37:38.120 回答