Windows下Libvirt Java API使用教程(三)- TLS认证访问和动态链接文件依赖

简介:

之前已经介绍过了libvirt api的上手使用方式:

《Windows下Libvirt Java API使用教程(二)- 接口使用说明》

Windows下Libvirt Java API使用教程(一)- 开发环境部署

这里再补充一些细节问题。

TLS安全认证访问:

之前我们给出的例子都是直接用tcp访问的,这就需要被访问的服务器开放tcp访问的端口,也就是说,任何机器只要知道了服务器的ip,都是可以访问上面的libvirt接口的。这是十分危险的,在生产环境中是不可取的。

所以,libvirt支持基于tls认证的安全访问协议。连接格式如下:

qemu+tls://10.4.54.10
或者
qemu://10.4.54.10(因为默认就是走tls的)

要想正常访问,必须在客户端和服务端配置证书,下面就介绍一个这个配置过程。

1、首先自然是证书生成工具的安装。libvirt官方推荐的工具是:GnuTLS。不过可惜,官网给出的地然居然不正确。GnuTLS项目,官网地址如下:
 
下载页面为:
 
这里介绍的windows环境下配置,所以进入页面:
 
2、解压下载的工具。通过命令行进入\bin目录(或者将该bin目录配置到环境变量的path即可在任意路径访问)  3、
 
首先为你的证书生成私钥(Create a private key for your CA):
 
 certtool --generate-privkey > cakey.pem
 

然后,为你证书进行自签名(and self-sign it by creating a file with the signature details called ca.info containing):

cn = Name of your organization
ca
cert_signing_key
 certtool --generate-self-signed --load-privkey cakey.pem \
  --template ca.info --outfile cacert.pem

先在\bin下创建一个叫ca.info的文件,里面写上如上第一段内容,

 

然后执行第二段引用所示命令:

 

报错。这下头疼了。。笔者翻箱倒柜,翻江倒海找了一通。。实在没有找到答案。。。考虑到证书的制作过程中没有与机器相关的信息,所以,决定求助笔者非常不熟悉的linux。掏出putty,登录,重新执行上面第一个命令。生成私钥:

 

然后同样按照上面的方式进行签名,果然轻松成功!

此时已经可以删除ca.info文件了。继续生成证书,接下来开始生成服务端私钥:

 certtool --generate-privkey > serverkey.pem

 

然后签名:

 certtool --generate-certificate --load-privkey serverkey.pem 
  --load-ca-certificate cacert.pem --load-ca-privkey cakey.pem 
  --template server.info --outfile servercert.pem

 同样是依靠一个叫做server.info的文件。先创建改文件,写入如下格式内容:

 organization = Name of your organization
cn = oirase
tls_www_server
encryption_key
signing_key

这里只有cn这个属性需要注意,他应该是当前主机的主机名:(only the CN field matters, which as explained above must be the server's hostname)- (The CN must match the hostname which clients will be using to connect to the server. In the example below, clients will be connecting to the server using a URI of xen://oirase/, so the CN must be "oirase".)

如果不知道主机名,用ip当然也是可以的。那么你的访问就是通过IP访问了。:)

成功。将服务端证书拷贝服务器的相应位置:

 serverkey.pem is the server's private key which should be copied to the server only as /etc/pki/libvirt/private/serverkey.pem.
servercert.pem is the server's certificate which can be installed on the server as /etc/pki/libvirt/servercert.pem.

最后是客户端的证书,过程类似,这里只列出主要过程和命令:

1、创建私钥:

certtool --generate-privkey > clientkey.pem

2、创建client.info模版文件:

 country = GB
state = London
locality = London
organization = Red Hat
cn = client1
tls_www_client
encryption_key
signing_key

    然后签名:

 certtool --generate-certificate --load-privkey clientkey.pem 
  --load-ca-certificate cacert.pem --load-ca-privkey cakey.pem 
  --template client.info --outfile clientcert.pem

3、 拷贝证书到客户端的指定位置(linux):

cp clientkey.pem /etc/pki/libvirt/private/clientkey.pem
cp clientcert.pem /etc/pki/libvirt/clientcert.pem

其中client.info中国家等信息可根据你的情况指定。


至此,需要的证书已经都准备好了。证书有了,服务端也部署了。但是windows的客户端不知道该部署到什么地方?因为网上的说明给出的都是linux文件路径,没说windows下的情况。不过笔者相信libvirt的错误日志:)于是:

怎么样,位置有了吧。赶紧拷贝过去试试。

有的同学可能发现,这里只给出了一个位置,我们有三个证书呢。别急,你看这个路径,比照网上给出的linux的路径格式:

Location Machine Description Required fields
/etc/pki/CA/cacert.pem Installed on all clients and servers CA's certificate (more info) n/a
/etc/pki/libvirt/ private/serverkey.pem Installed on the server Server's private key (more info) n/a
/etc/pki/libvirt/ servercert.pem Installed on the server Server's certificate signed by the CA. (more info) CommonName (CN) must be the hostname of the server as it is seen by clients.
/etc/pki/libvirt/ private/clientkey.pem Installed on the client Client's private key. (more info) n/a
/etc/pki/libvirt/ clientcert.pem Installed on the client Client's certificate signed by the CA (more info) Distinguished Name (DN) can be checked against an access control list (tls_allowed_dn_list).
其实基本已经可以猜出windows下的目录组织了。linux在的/etc目录,就想当于我们这里的..\libvirt目录,子目录的组织相同即可。

没猜出来也不用担心,最多我们复制一个证书尝试一次,错误信息会依次告诉你所有的路径的:)

再访问一下,成功~


补充说明一下关于动态链接文件的问题:

之前介绍的时候,笔者只提到说调用libvirt Java api需要一个virt.dl文件,这个文件笔者是拷贝的libvirt-0.dll文件改名而来,然后访问成功。

笔者后来发现,原来libvirt 安装目录的bin文件夹下的所有文件,其实都是改dll文件的依赖文件,当笔者将其他文件删除或转义的时候,依然会报找不到virt.dll文件的错误。所以,如果调用libvirt Java API开发,可以将所有的dll拷贝到一个指定位置,然后指定jna.library.path到该位置即可。

关于文中提到的尚未解决的问题,如果您有解决的方案或是任何想法,欢迎留言讨论,笔者不堪忍受这种困扰。如果笔者找到了方案,一定会补充进来。
以上,欢迎讨论赐教:)





     本文转自mushiqianmeng 51CTO博客,原文链接:http://blog.51cto.com/mushiqianmeng/876189,如需转载请自行联系原作者




相关文章
|
11天前
|
SQL 安全 Java
「滚雪球学Java」教程导航帖(更新2024.07.16)
《滚雪球学Spring Boot》是一个面向初学者的Spring Boot教程,旨在帮助读者快速入门Spring Boot开发。本专通过深入浅出的方式,将Spring Boot开发中的核心概念、基础知识、实战技巧等内容系统地讲解,同时还提供了大量实际的案例,让读者能够快速掌握实用的Spring Boot开发技能。本书的特点在于注重实践,通过实例学习的方式激发读者的学习兴趣和动力,并引导读者逐步掌握Spring Boot开发的实际应用。
27 1
「滚雪球学Java」教程导航帖(更新2024.07.16)
WXM
|
1天前
|
Oracle Java 关系型数据库
Java JDK下载安装及环境配置超详细图文教程
Java JDK下载安装及环境配置超详细图文教程
WXM
15 3
|
10天前
|
测试技术 API Android开发
《手把手教你》系列基础篇(九十七)-java+ selenium自动化测试-框架设计篇-Selenium方法的二次封装和页面基类(详解教程)
【7月更文挑战第15天】这是关于自动化测试框架中Selenium API二次封装的教程总结。教程中介绍了如何设计一个支持不同浏览器测试的页面基类(BasePage),该基类包含了对Selenium方法的二次封装,如元素的输入、点击、清除等常用操作,以减少重复代码。此外,页面基类还提供了获取页面标题和URL的方法。
27 2
|
11天前
|
Web App开发 XML Java
《手把手教你》系列基础篇(九十六)-java+ selenium自动化测试-框架之设计篇-跨浏览器(详解教程)
【7月更文挑战第14天】这篇教程介绍了如何使用Java和Selenium构建一个支持跨浏览器测试的自动化测试框架。设计的核心是通过读取配置文件来切换不同浏览器执行测试用例。配置文件中定义了浏览器类型(如Firefox、Chrome)和测试服务器的URL。代码包括一个`BrowserEngine`类,它初始化配置数据,根据配置启动指定的浏览器,并提供关闭浏览器的方法。测试脚本`TestLaunchBrowser`使用`BrowserEngine`来启动浏览器并执行测试。整个框架允许在不同浏览器上运行相同的测试,以确保兼容性和一致性。
26 3
|
9天前
|
Java 数据安全/隐私保护
Java无模版导出Excel 0基础教程
经常写数据导出到EXCEL,没有模板的情况下使用POI技术。以此作为记录,以后方便使用。 2 工具类 样式工具: 处理工具Java接口 水印工具 导出Excel工具类 3 测试代码 与实际复杂业务不同 在此我们只做模拟 Controller Service 4 导出测试 使用Postman进行接口测试,没接触过Postman的小伙伴可以看我这篇博客Postman导出excel文件保存为文件可以看到导出很成功,包括水印 sheet页名称自适应宽度。还有一些高亮……等功能可以直接搜索使用
Java无模版导出Excel 0基础教程
|
10天前
|
监控 API 网络安全
​邮件通知提醒邮箱警告设置教程及API代码示例
**摘要:** 在系统管理中,邮件通知提醒用于及时报告异常和重要事件。本文提供AOKSend的设置教程和API代码示例,教你如何配置邮件警告。通过自动化邮件通知,可以提升响应速度,确保系统稳定性。步骤包括注册AOKSend账户、获取API密钥、设置SMTP配置、创建触发条件及编写Python API代码示例。利用AOKSend API发送警告邮件,如CPU使用率过高通知,可有效监控和测试,确保系统异常时能快速响应。
|
5天前
|
存储 JSON API
实战派教程!Python Web开发中RESTful API的设计哲学与实现技巧,一网打尽!
【7月更文挑战第22天】构建RESTful API实战:**使用Python Flask设计图书管理API,遵循REST原则,通过GET/POST/PUT/DELETE操作处理/books及/books/<id>。示例代码展示资源定义、请求响应交互。关键点包括HTTP状态码的使用、版本控制、错误处理和文档化。本文深入探讨设计哲学与实现技巧,助力理解RESTful API开发。
17 0
|
2月前
|
Oracle Java 关系型数据库
windows 下 win11 JDK17安装与环境变量的配置(配置简单详细,包含IJ中java文件如何使用命令运行)
本文介绍了Windows 11中安装JDK 17的步骤,包括从官方网站下载JDK、配置环境变量以及验证安装是否成功。首先,下载JDK 17的安装文件,如果没有Oracle账户,可以直接解压缩文件到指定目录。接着,配置系统环境变量,新建`JAVA_HOME`变量指向JDK安装路径,并在`Path`变量中添加。然后,通过命令行(cmd)验证安装,分别输入`java -version`和`javac -version`检查版本信息。最后,作者分享了如何在任意位置运行Java代码,包括在IntelliJ IDEA(IJ)中创建的Java文件,只需去掉包声明,就可以通过命令行直接运行。
966 1
|
8月前
|
数据安全/隐私保护 Windows
Mac 或Windows下配置hosts文件
Mac 或Windows下配置hosts文件
248 0