Java 拥有一个恒定的密钥库会降低安全性吗?

Java 拥有一个恒定的密钥库会降低安全性吗?,java,security,ssl,encryption,Java,Security,Ssl,Encryption,我正在写一个网络实用程序,我希望它有三个协议纯文本,显然,它通过网络发送纯文本/字节ENCRYPTED\u SECURED,使用加密,但不验证任何身份;以及ENCRYPTED\u SECURED,使用SSL或TSL 现在,我已经实现了纯文本,并且部分实现了加密,但是我遇到了一个障碍。我将SSLSockets用于加密\u UNSECURED,但是对于自签名证书和伪信任管理器,自签名证书需要来自密钥管理器,该密钥管理器来自java密钥工具生成的密钥文件 我想知道的是:在服务器/客户机的每个实例中使用

我正在写一个网络实用程序,我希望它有三个协议
纯文本
,显然,它通过网络发送纯文本/字节
ENCRYPTED\u SECURED
,使用加密,但不验证任何身份;以及
ENCRYPTED\u SECURED
,使用SSL或TSL

现在,我已经实现了
纯文本
,并且部分实现了
加密
,但是我遇到了一个障碍。我将SSLSockets用于
加密\u UNSECURED
,但是对于自签名证书和伪信任管理器,自签名证书需要来自密钥管理器,该密钥管理器来自java密钥工具生成的密钥文件

我想知道的是:在服务器/客户机的每个实例中使用相同的密钥文件会降低加密的安全性吗?由于它是
加密的\u不安全的
,我不关心身份验证的安全性

注意:这是在java中完成的

编辑:为什么这不是重复的?
我没有尝试导入证书,我知道如何导入,我想知道使用相同的证书是否会降低SSL/TSL加密协议的安全性。

首先,不要使用实际的SSL;SSLv2在很久以前就被破坏了(2000年之前),而SSLv3现在在大多数情况下都被狮子狗破坏了(参见维基百科和/或关于security.SE和crypto.SE的十几个问题)。(注意Java/JSSE中的伪协议
SSLv2Hello
实际上不是SSLv2,也不是一个安全漏洞;自2010年以来,它很少需要或有用,现在更容易引起混淆。)

警告:Java使用一种“体系结构”进行加密,允许不同的“提供者”执行相同的功能,具体取决于JRE的构建方式(由谁构建)以及您的安装是否已被修改。我假设您使用的是Java的Oracle(或以前的Sun)版本,或者使用相同加密提供程序的另一个版本,其中可能包括OpenJDK(与Oracle/Sun的源代码基本相同)。特别是@Michal的回答似乎是假设IBM的,尽管我在你的问题中没有看到任何迹象表明这一点;IBM Java虽然在其他方面与Oracle/Sun Java兼容,但它有自己的加密提供程序集,我不知道IBM的任何差异是否会影响这里的问题

最后(!)回答您的问题:将一个私钥(密钥库)分发给多个参与方会增加妥协的风险,至少与数量成正比——可能更多是因为人们通常对他们认为是他人责任的事情不太小心

TLS(像之前的SSL一样)支持几种不同的密钥交换选项

  • 短暂的Diffie-Hellman以经典(Zp)形式
    DHE
    或椭圆曲线形式
    ECDHE
    。这些通常是首选的,特别是Java/JSSE客户机首先订购它们(除了Java7早期更新中的bug),因为它们提供了;将现在视为未来的开始——俗话说‘今天是你余生的第一天’——即使服务器私钥已经泄露,这也能保持机密性,至少假设DHE/ECDHE实现是正确的

    如果服务器运行在Java7或更早版本上,请确保不要使用(Zp)DHE;这些版本使用了768位DH组,该组太小。Java8默认值为1024,这就足够了,除非是对付像NSA这样的顶级对手,详见;并且可以配置为2048,这绝对足够了,请参阅 或者其他几个。注意Java7和更高版本(但不是现成的6)同时支持DHE和ECDHE,并且更喜欢ECDHE,javaecdhe使用足够的曲线,因此在实践中这应该不是问题

  • (普通)RSA。如果私钥被泄露,这是不安全的,因此在您的情况下,您应该尽可能禁用所有普通RSA密码套件。
    {TLS,SSL}u DHE_RSA_..
    TLS_ECDHE_RSA_..
    形式的密码套件仅将RSA用于身份验证而非加密;您必须避免的是
    {SSL,TLS}\u RSA…

  • 匿名。TLS还支持使用DH或ECDH临时密钥进行密钥交换,但不进行身份验证(即根本没有证书);这些套件被称为“匿名”,而不是短暂的,其形式为
    {SSL/TLS}{DH,ECDH}\u anon.
    。这实际上与您提供机密性而不是身份验证的目标在技术上完全匹配,并且不需要服务器上的密钥库或客户端上的信任库,另外还避免了下面的主机名问题。可能的缺点是默认情况下禁用匿名套件,这正是因为大多数用户希望“安全套接字”或“传输安全性”是安全的,所以必须启用它们(在两端);此外,如果您的组织(或您的用户,如果不同的话)确实考虑过安全策略,那么这种考虑通常出于同样的原因禁止匿名TLS,并且与某些策略项不同,这一项几乎总是可以通过扫描或监视来实施

  • 其他人。TLS还支持非phemeral aka静态DH和ECDH,但实际上没有人使用它们。TLS还支持使用Kerberos、SRP或仅使用任意密钥(PSK)的非PKC方案,但这些方案通常仅适用于特殊情况。其中Java支持静态ECDH和Kerberos;在您的环境中使用静态ECDH与普通RSA一样不安全,即使在Kerberos可用的环境中,IME与Java一起使用也会像用锤子敲自己的脑袋一样有趣

主机名检查:最后,对于使用证书的(非匿名)套件,Java SSL/TLS客户端通常会检查用于连接到服务器的名称(域名或IP地址)是否与证书匹配;证书必须包含ei