一个进程如何与同一主机上的另一个进程进行身份验证和安全通信

Posted

技术标签:

【中文标题】一个进程如何与同一主机上的另一个进程进行身份验证和安全通信【英文标题】:How can a process authenticate and communicate securely with another process on the same host 【发布时间】:2012-09-24 07:40:05 【问题描述】:

我曾尝试使用基于 SSL 的 Java RMI 来执行此操作,但后来我发现 SSL 证书将提供主机级别的身份验证,而不是进程级别的身份验证。

另外,我将密钥库的密码存储在配置中;因此证书可以被另一个攻击者进程使用,并且可以进行身份​​验证。

【问题讨论】:

如果您需要同一主机中的两个进程之间的安全性,那么您遇到的问题要比 RMI 或 SSL 解决的问题大得多。 【参考方案1】:

用于 SSL/TLS 的 X.509 证书可能用于识别主机名以外的其他内容(这通常已用于客户端证书)。

与服务器建立 SSL/TLS 连接时涉及两种类型的验证:

证书验证本身:验证证书在使用时是否可用于所需用途,通常使用 RFC 3280/RFC 5280 中描述的 PKI。 主机名验证:一旦它相信证书是真实的,客户端就会检查它是否适用于它正在寻找的服务器。这是特定于协议的(例如 RFC 2818,HTTPS 的第 3.1 节),但在 RFC 6125 中已针对大多数协议进行了概括。(这类似于检查护照上的图片是否与您面前的姓名匹配,而不仅仅是接受任何有效护照。)

默认情况下,Java 的SSLSockets 不会执行第二步,除非您添加一些内容来执行此操作。 (在 Java 7 中,一些新的 SSL 参数允许您在信任管理器中这样做,但仅限于特定协议。)

您需要找到一种方法来定义您希望如何识别其他应用程序和进程,使用主机名以外的其他名称,使用这些命名约定颁发证书,并让您的客户端应用程序对此进行检查。

您应该能够在SSLSocketFactory 中实现自己的身份验证机制,然后在每个方法中返回套接字之前,将该工厂用于您的 RMI 应用程序,如下所述:https://blogs.oracle.com/lmalventosa/entry/using_the_ssl_tls_based1

【讨论】:

使用 X.509 证书似乎是验证每个进程身份的最佳方式,因为我们为每个可以验证的进程分配了不同的名称。唯一的问题是保护密钥库***.com/questions/8357868/… 中的证书。手动提供密钥库密码将是最好的选择。 在使用 HandshakeCompletedListener 进行编码时,我怀疑如果我使用自签名证书创建密钥库并将该密钥库用作客户端和服务器端的密钥库和信任库,将会出现什么问题.

以上是关于一个进程如何与同一主机上的另一个进程进行身份验证和安全通信的主要内容,如果未能解决你的问题,请参考以下文章

如何使用信号调用同一进程中的另一个线程在轮询函数上休眠的进程而不杀死它?

向同一进程中的另一个线程发出信号

我可以快速进行 SSH 身份验证吗?

进程间通信

UDP协议详解

如何在 C# 中创建一个没有密码的另一个用户的进程?