- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我目前正在开发 Java TLS 服务器。我正在尝试让以下 CipherSuite 工作:TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA
当我使用 openssl s_client 测试它时,我在 ServerKeyExchange 消息后收到以下错误:
140735242416208:error:1414D172:SSLroutines:tls12_check_peer_sigalg:wrong signature type:t1_lib.c:1130:
握手因 decode_error fatal error 而失败。
所以我猜客户不喜欢选择的签名算法。
但根据 RFC 5246 Section-7.4.1.4.1,我现在只使用默认的 SignatureAndHashAlgorithm
If the negotiated key exchange algorithm is one of (RSA, DHE_RSA,DH_RSA, RSA_PSK, ECDH_RSA, ECDHE_RSA), behave as if client had sentthe value {sha1,rsa}.
(我仍在检查客户端是否提供这些默认值)
因为我在做 ECDHE_RSA,所以我相信我应该按照 RFC 4492 第 5.4 节对 serverECDHparams 进行哈希处理和签名(这里是第一篇文章,所以只有 2 个链接,抱歉 :))
ServerKeyExchange.signed_params.sha_hash
SHA(ClientHello.random + ServerHello.random +
ServerKeyExchange.params);
struct {
select (KeyExchangeAlgorithm) {
case ec_diffie_hellman:
ServerECDHParams params;
Signature signed_params;
};
} ServerKeyExchange;
我应该按照 RFC 2246 第 7.4.3 节执行此操作
select (SignatureAlgorithm) {
case rsa:
digitally-signed struct {
opaque md5_hash[16];
opaque sha_hash[20];
};
} Signature;
md5_hash
MD5(ClientHello.random + ServerHello.random + ServerParams);
sha_hash
SHA(ClientHello.random + ServerHello.random + ServerParams);
我关于签署 serverParams 的 Java 代码:
private byte[] getSignedParams(ChannelBuffer params)
throws NoSuchAlgorithmException, DigestException,
SignatureException, InvalidKeyException {
byte[] signedParams = null;
ChannelBuffer signAlg = ChannelBuffers.buffer(2);
MessageDigest md5 = MessageDigest.getInstance("MD5");
MessageDigest sha = MessageDigest.getInstance("SHA-1");
switch (session.cipherSuite.sign) {
case rsa:
signAlg.writeByte(2); // 2 for SHA1
sha.update(clientRandom);
sha.update(serverRandom);
sha.update(params.toByteBuffer());
md5.update(clientRandom);
md5.update(serverRandom);
md5.update(params.toByteBuffer());
signedParams = concat(md5.digest(), sha.digest());
break;
}
signAlg.writeByte(session.cipherSuite.sign.value); // for RSA he byte is one
ChannelBuffer signLength = ChannelBuffers.buffer(2);
signLength.writeShort(signedParams.length);
return concat(signAlg.array(),concat(signLength.array(),signedParams));
}
所以我的问题基本上是:这一切我错了吗?如果是这样,我做错了什么?
感谢您的宝贵时间! :)
最佳答案
又是我,我似乎已经解决了我注意到的两件事:
第二项是我应该在 RFC 中找到但没有找到的(也许它写在某个地方,我不知道)我认为这对那些不使用 Java 的人可能有用;)
我的代码现在看起来如何:
private byte[] getSignedParams(ChannelBuffer params)
throws NoSuchAlgorithmException, DigestException,
SignatureException, InvalidKeyException {
byte[] signedParams = null;
Signature signature = Signature.getInstance(selectedSignAndHash.toString());
ChannelBuffer signAlg = ChannelBuffers.buffer(2);
signAlg.writeByte(selectedSignAndHash.hash.value);
signature.initSign(privateKey);
signature.update(clientRandom);
signature.update(serverRandom);
signature.update(params.toByteBuffer());
signedParams = signature.sign();
signAlg.writeByte(session.cipherSuite.sign.value);
ChannelBuffer signLength = ChannelBuffers.buffer(2);
signLength.writeShort(signedParams.length);
return concat(signAlg.array(), concat(signLength.array(), signedParams));
}
代码是不同的,因为在两者之间我添加了一个函数来从客户端提供的列表中选择要使用的 SignatureAndHashAlgorithm。但是您可以将其修改为仅使用 SHA1withRSA 进行响应,因为这似乎是默认的 HashAndSignatureAlgorithm。
关于ssl - TLS 1.2 ECDHE_RSA 签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38274214/
我正在尝试在我的服务器上启用 ECDHE_RSA。我正在运行 Apache2 和 OpenSSL。在我的 ssl.conf 文件中,我尝试使用这些配置使其工作: SSLProtocol All -SS
我目前正在开发 Java TLS 服务器。我正在尝试让以下 CipherSuite 工作:TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA 当我使用 openssl s_clien
我是一名优秀的程序员,十分优秀!