构建Libvirt的x509证书远程tls连接

​http://libvirt.org/remote.html​



连接格式:


1. 通用格式:

driver[+transport]://[username@][hostname][:port]/[path][?extraparameters]


2. 如使用qemu和tls的:(在配置完毕后)

virsh -c qemu+tls://10.61.1.85/system



证书类型及位置:


见http://libvirt.org/remote.html

1. CA证书:server和client

2. server的私有Key,及公有Key(由CA颁发的):server上

3. client的私有Key,及公有Key(由CA颁发的):client上



TLS认证原理:


1. client认证server。client将server发送的证书与server的hostname进行匹配

2. server认证client的可控性。server对client的IP,或者client的IP和证书来进行认证

3. 默认的server的libvirt的配置是不对DN进行检查,也就是说允许所有的拥有CA颁发的证书的client登入



搭建CA、server端证书、client端证书:


1. 过程见那个网页

2. 没有的/etc/pki/libvirt目录可以创建



配置、运行和调试:


1. server上配置:

如果想显式控制访问者,则可以修改/etc/libvirt/libvirtd.conf

a. Uncomment : tls_allowed_dn_list,改成类似这样的”

tls_allowed_dn_list = ["C=CN,O=red_hat,L=Beijing,ST=Beijing,CN=10.61.1.87"]


b. 注意几点:

i. 各个项的顺序要一致,比如使用这样则不能认证:

tls_allowed_dn_list = ["C=CN,ST=Beijing,L=Beijing,O=red_hat,CN=10.61.1.87"]

ii. 中间逗号后面不能有空格

iii. 如果犯了i,ii的错误,则可能会有这样的错误:

Connecting to uri: qemu+tls://10.61.1.85/system

error: unable to connect to libvirtd at '10.61.1.85': Invalid argument

error: failed to connect to the hypervisor


2. client及server端的运行:

a. server端libvirtd启动必须要以--listen选项启动

b. client端执行:virsh -c qemu+tls://10.61.1.85/system


3. 认证失败的调试

a. 使用/usr/sbin/libvirtd --listen --verbose 来启动libvirtd,可以出现部分错误信息,如tls_allowed_dn_list各项的顺序不对时,会出现:

15:44:48.527: error : remoteCheckCertificate:1138 : remoteCheckCertificate: client's Distinguished Name is not on the list of allowed clients (tls_allowed_dn_list).  Use 'openssl x509 -in clientcert.pem -text' to view the Distinguished Name field in the client certificate, or run this daemon with --verbose option.

15:44:48.527: error : remoteCheckAccess:1157 : remoteCheckCertificate: failed to verify client's certificate


b. 接上一条,如果出现了那个信息,可以使用openssl x509 -in clientcert.pem -text来对client的公钥进行信息输出,并注意这个字段:

Subject: C=CN, O=red_hat, L=Beijing, ST=Beijing, CN=10.61.1.87

其实这一行的主体内容去掉空格,就是tls_allowed_dn_list中应该填的DN内容