具有cname的FreeIPA请求证书

时间:2018-12-18 16:48:57

标签: ssl certificate cname a-records freeipa

前一段时间,我想知道如何为cname创建ssl证书。之所以出现这种情况,是因为我们始终对虚拟机使用通用的A记录。用户应通过其服务名称通过SSL访问在这些虚拟机上运行的服务。我们使用FreeIPA作为我们的证书颁发机构。

2 个答案:

答案 0 :(得分:0)

有时,您搜索年龄的答案,然后在不太清楚的多个网站上找到答案。我将通过一个示例来说明我的答案,以显示在向FreeIPA申请证书时,使用为cname和不使用为cname的差异。

我们制作了一个假想的虚拟机,其a记录为abc955-xy.example.com。在这台机器上,我们将运行postgres。因此,出于方便起见,该名称将为postgresql.example.com。首先,我们为abc955-xy.example.com创建一个证书,该证书仅对fqdn有效。其次,我们为cname创建一个证书,该证书对fqdn也有效。

没有姓氏的证书

# 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原则添加到主机,而不是将具有fqdn的HTTP原则添加到主机。

注意:由于Chrome和Chromium之类的浏览器从65版本开始仅接受带有使用者替代名称(SAN)的证书,因此您也需要在不含cname的证书中添加使用者替代名称。这是ipa-getcert请求中-D选项的来源。对于没有cname的证书,您必须提供fqdn。

答案 1 :(得分:-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