简单的 Akka SSL 加密

5
在stackoverflow上有关于Akka、SSL和证书管理的几个问题,以启用Akka actor之间的安全(加密)点对点通信。
Akka文档中关于远程通讯(http://doc.akka.io/docs/akka/current/scala/remoting.html)指向该资源作为如何生成X.509证书的示例。

http://typesafehub.github.io/ssl-config/CertificateGeneration.html#generating-a-server-ca

由于这些演员正在内部服务器上运行,因此为example.com(或任何DNS名称)生成服务器CA似乎不相关。大多数服务器(例如在亚马逊网络服务上运行的EC2实例)将在VPC中运行,并且初始的Akka远程将是私有IP地址,如: remote = "akka.tcp://sampleActorSystem@172.16.0.10:2553" 我的理解是,应该可以创建自签名证书并生成所有节点共享的信任存储区。
随着更多的Akka节点上线,它们应该(我假设)能够使用通过所有其他对等方使用的同一自签名证书和信任存储区。我还认为,即使您没有CA,也没有必要信任所有对等方的不断增长的证书列表,因为信任存储区将验证该证书并避免中间人攻击。
理想的解决方案和希望是,可以生成一个单个的自签名证书,无需进行CA步骤,一个单独的信任存储文件,并在任何组合的Akka远程/(调用远程和远程的客户端,即所有对等方)之间共享它。

必须有一个简单易懂的过程来生成证书,以进行简单的内部加密和客户端身份验证(只信任所有同行者)

问题:这些文件可以在每个同行者上都相同吗?这将确保它们正在与可信客户端通信并启用加密吗?

key-store = "/example/path/to/mykeystore.jks"
trust-store = "/example/path/to/mytruststore.jks"

问题:上面链接的X.509指令是否过于复杂 - 是否存在简单的自签名/信任存储方法,无需执行CA步骤?特别是针对仅限内部IP地址(没有DNS)且不在证书中使用增加的IP地址网络,因为服务器可能会自动缩放。

这似乎是一个适合在security.stackexchange.com上提问的问题。 - bob0the0mighty
1个回答

2
首先,我必须承认我不了解Akka,但我可以给你提供在SSL协议中使用X509证书的识别指南。 akka服务器配置需要绑定到主机名的SSL证书。

您需要一个具有DNS主机名的服务器,以进行主机名验证。在此示例中,我们假设主机名为example.com。

SSL证书可以绑定到DNS名称或IP(不常见)。为了使客户端验证正确,它必须对应于服务器的IP /主机名。
AKKA要求每个服务器都有一个由公共CA签发的证书。
CA
  - server1: server1.yourdomain.com (or IP1)
  - server2: server2.yourdomain.com  (or IP2)

为了简化服务器部署,您可以使用通配符*.yourdomain.com
CA
  - server1: *.yourdomain.com 
  - server2: *.yourdomain.com  

在客户端,您需要配置一个信任库,其中包括JKS中CA证书的公钥。客户端将信任由此CA颁发的任何证书。
在您描述的方案中,我认为您不需要密钥库。只有当您还想使用证书标识客户端时才需要它。在这两种情况下都会建立SSL加密通道。
如果您没有像“yourdomain.com”这样的域名,并且想使用内部IP,则建议为每个服务器发行证书并将其绑定到IP地址。
根据Akka如何验证服务器证书,可以使用唯一的自签名证书用于所有服务器。Akka可能依赖于JVM默认的信任配置。如果您在信任库中(而不是CA)包括自签名证书,则ssl套接字工厂将信任提供此证书的连接,即使它已过期或服务器的主机名和证书不匹配。我不建议这样做。

谢谢。想知道大家对于只需要合理的SSL加密这一要求的看法 - 在所有节点之间(节点1信任节点2,节点2信任节点1,节点1信任节点3,节点3必须信任节点1和节点2,......你懂的,这可能是一个指数级别的节点信任列表,可以自动扩展,IP地址会变化等)。 主要希望有一个通用的SSL证书来进行加密。 不确定是否需要客户端认证,否则我认为它需要一个内部DNS(例如AWS路由53内部DNS)来创建覆盖*.mycompany.local的证书。 - Jeff Steinmetz
由于您拥有所有对等方,我认为不需要客户端身份验证。只有在需要在您的网络之外对客户端进行身份验证时才应使用它。每个服务器都将拥有由主CA颁发的证书,因此实际上这种方案可以实现相同的功能,并且所需的配置将显着简化。 - pedrofb
我想知道是否需要“生成服务器CA”。如果不需要客户端认证,那么生成一个没有CA的自签名证书是否更加简单明了? - Jeff Steinmetz
如果您生成多个证书,使用CA来简化信任配置非常方便。但是,如果最终选择单个证书,使用CA或自签名证书之间实际上没有太大区别。还要记住,使用CA会使更新过程更简单,因为在更新ssl证书(2-3年)时不需要修改truststore。 - pedrofb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接