我正在尝试使用OpenSSL实现DTLS服务器.我可以通过,但当客户端和服务器协商时,我注意到服务器上的session_id为空.
检查代码,更具体地说是ssl_sess.c,session_id_length被明确设置为零,注释引用RFC4507.
我的问题是,在协商连接时,我可以使用什么ID来唯一标识客户端?
我注意到在客户端,会话ID似乎是从票证计算出来的,但这似乎不会在服务器上发生.
我正在学习使用SSL和UDP.经过一番广泛的搜索,我找不到很多样本程序来测试和研究.事实上,我发现的唯一一个就是这个.
http://openssl.6102.n7.nabble.com/DTLS-examples-td2143.html
然而,虽然作者声称它是非阻塞的,但在阅读代码之后我不认为这是我们通常的意思,因为它根本不使用select()或poll().想在这里得到一些帮助,真的很感激.
这是我在OpenSSL服务器模式下的程序,
初始化SSL和BIO变量的一部分:
map<int, SSL> m_SSLMap;
map<int, BIO> m_BioWriteMap;
map<int, BIO> m_BioReadMap;
int InitializeServerNegotiationMode(int iFd)
{
SSL *pServSslFd;
BIO *pWb, *pRb;
pServSslFd = SSL_new(m_pCtx);
assert(pServSslFd);
if ( SSL_version(pServSslFd) == DTLS1_VERSION)
{
pWb = BIO_new(BIO_s_mem());
pRb = BIO_new(BIO_s_mem());
assert(pWb);
assert(pRb);
SSL_set_bio(pServSslFd, pRb, pWb);
SSL_set_accept_state(pServSslFd);
}
m_SSLMap[iFd] = *pServSslFd;
m_BioReadMap[iFd] = *pRb;
m_BioWriteMap[iFd] = *pWb;
return INITIALIZATION_SUCCESS;
}
Run Code Online (Sandbox Code Playgroud)
服务器模式协商DTLS数据到达服务器时的操作:
int ServerModeDTLSNegotiation(int iChannel, const char *pBuff, const int iLen, int iFd)
{
SSL *pServSslFd;
BIO *pRbio;
BIO *pWbio;
pServSslFd = &m_SSLMap[iFd];
pRbio = &m_BioReadMap[iFd]; …Run Code Online (Sandbox Code Playgroud) 我正在尝试根据Californium.Scandium中的示例java文件在Android上设置DTLS服务器.最初我遇到了问题,因为密钥库和信任库是jks格式的,我没有密钥密码.因此,我使用Portecle创建了自己的PKCS12密钥库和信任库.
KeyStore keyStore = KeyStore.getInstance("PKCS12");
in = getResources().openRawResource(R.raw.keystore);
keyStore.load(in, KEY_STORE_PASSWORD.toCharArray());
KeyStore trustStore = KeyStore.getInstance("PKCS12");
inTrust = getResources().openRawResource(R.raw.truststore);
trustStore.load(inTrust, TRUST_STORE_PASSWORD.toCharArray());
Run Code Online (Sandbox Code Playgroud)
之后,代码在密钥库加载期间没有抛出任何错误,但是在运行应用程序时我得到了这个:
FATAL EXCEPTION: main
Process: com.example.admin.securesend, PID: 3402
java.lang.RuntimeException: Unable to start activity
ComponentInfo{com.example.admin.securesend/com.example.admin.securesend.DTLSServer}: java.lang.IllegalStateException: Keys must be ECDSA capable when support for an ECDHE_ECDSA based cipher suite is configured
Run Code Online (Sandbox Code Playgroud)
编辑:我意识到我的密钥是使用SHA而不是ECDSA创建的.我对密钥库和密钥不是很熟悉,所以我假设我的密钥库现在有效,我只需要为系统生成适当的密钥并将它们植入密钥中.如何使用ECDSA创建密钥并将其传输到我的密钥库?
我正在使用Restcomm的Android SDK并尝试将其配置到我们的服务器,但收到以下错误:
RCConnection Error: setSDP Error: Failed to set remote offer sip: Called with SDP without DTLS fingerprint
Run Code Online (Sandbox Code Playgroud)
但是,当我改回Restcomm服务器时,它工作正常.
我试图在Google和Git上搜索它,但那里提供的解决方案没有帮助.知道如何解决这个问题(请详细解释,因为我是WebRTC的新成员)?
编辑:
如果我从移动设备呼叫到网络或从网络呼叫到网络,它可以正常工作.仅当移动设备尝试接受呼叫时才会出现此问题.
我有一个应用程序可以在 iOS 中通过 WebRTC 接听电话,当使用浏览器调用时工作正常,但是当使用 Android 应用程序调用时我无法设置远程 sdp,并出现错误:使用 SDP 调用而无需 DTLS 指纹。搜索后我发现从android发送的sdp没有DTLS参数:a = setup ...,a = Fingerprint ....并且流媒体只有RTP / AVPF,如下所示。你能帮我解决这个问题吗?谢谢!注意:Android与android之间的通话是正常的。
m=video 9 RTP/AVPF 96 97 98 99 100 101 127 123 125
Run Code Online (Sandbox Code Playgroud) 我想用 Java 实现 DTLS 1.0 客户端,经过一番谷歌搜索后,我发现JSSERefGuide说了以下内容:
JSSE API 能够支持 SSL 版本 2.0 和 3.0 以及 TLS 版本 1.0。这些安全协议封装了普通的双向流套接字,JSSE API 添加了对身份验证、加密和完整性保护的透明支持。JDK 附带的 JSSE 实现支持 SSL 3.0、TLS(1.0、1.1 和 1.2)和 DTLS(版本 1.0 和 1.2)。它不实现 SSL 2.0。
所以我想我可以用纯Java实现它而不使用任何库(例如BouncyCastle)
但是当我尝试运行(以及其他一些,如 DTLSv1.2、DTLSv1...)时:
final SSLContext sslContext = SSLContext.getInstance("DTLSv1.0", "SunJSSE");
Run Code Online (Sandbox Code Playgroud)
它抛出:
Exception in thread "main" java.security.NoSuchAlgorithmException: no such algorithm: DTLSv1.0 for provider SunJSSE
at sun.security.jca.GetInstance.getService(GetInstance.java:87)
at sun.security.jca.GetInstance.getInstance(GetInstance.java:206)
at javax.net.ssl.SSLContext.getInstance(SSLContext.java:199)
Run Code Online (Sandbox Code Playgroud)
例如以下工作:
final SSLContext sslContext = SSLContext.getInstance("TLSv1.2", "SunJSSE");
Run Code Online (Sandbox Code Playgroud)
列出所有安全提供商,我根本没有发现任何 DTLS 内容。
那么实际上有 DTLS 实现吗?如果是的话你应该如何使用它?
我正在寻找一个使用 DTLS 的应用程序,例如语音聊天。
当原始声音数据包丢失时,DTLS 可以工作吗?
某些数据包丢失后 DTLS 会话是否仍能正常运行,而无需重新发送丢失的数据包,这违背了使用 UDP(拥塞的 TCP 延迟)的目的。
即使部分声音数据丢失,仍然可以听到声音。
通信对于重放攻击是否仍然安全?
我正在尝试配置websocket以使用星号11.但是有一些问题.我遵循的步骤是:在http.conf中启用以下内容
enabled=yes
bindaddr=0.0.0.0
bindport=8088
Run Code Online (Sandbox Code Playgroud)
我还配置了支持DTLS的星号.但是当我尝试连接到websocket的新WebSocket时("ws:// mySeverIp:8088/ws"); .它抛出一个错误
WebSocket connection failed: Error during WebSocket handshake: Unexpected response code: 400
Run Code Online (Sandbox Code Playgroud)
有人请帮忙.
谢谢
我想知道导致DTLS-SRTP成为保护WebRTC中媒体的方法的原因.
我认为最好在信令平面之外交换SRTP密钥材料,但为什么不允许其他方法如SDES呢?对我来说,它似乎比通过DTLS握手更快,并且如果你可以保证信令通道是安全的那样,就像DTLS-SRTP一样安全......
now I need to make webrtc SDP -> normal SDP.
so I need to encode and decode fingerprint in webrtc. I think that fingerprint is SRTP encrypt method.
anyone have experience decode and encode fingerprint. I need following step
WEBRTC SDP -> signal server(decode fingerprint, make normal rtp SDP) -> sip client.
sip 客户端 SDP(普通 rtp)-> 信号服务器(编码指纹,制作 webrtc sdp)-> WEBRTC。
我们依次解码和编码 SRTP 服务器...
请帮我