Poco SSLManager和SecureStreamSocket能支持SSL / TLS PSK(预共享密钥密码套件)吗?

时间:2017-05-01 07:55:44

标签: c++ ssl openssl poco

我想找到一些与PSK(预共享密钥密码套件)的Poco SSL连接的代码片段。 但是我发现了一些总是使用证书(私钥/公钥)的例子。 是否可以支持PSK SSL / TLS?如果是的话,我该怎么做? 还是有任何提示?

提前致谢。

添加了一些CERT代码段以供参考。 我可以用CERT(和privkey)来做,但我不知道如何为PSK做这个。 这是我的CERT代码片段。

======================= CERT代码===================== ============

try
{
    initializeSSL();
    SharedPtr<InvalidCertificateHandler> ptrHandler = new AcceptCertificateHandler(false);
    Context::Ptr ptrContext = new Context(Context::CLIENT_USE, "certs/client01.key", "certs/client01.crt", "", Context::VERIFY_RELAXED, 9, true, "ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH");
    SSLManager::instance().initializeClient(0, ptrHandler, ptrContext);

    SocketAddress sa(host, port);
    SecureStreamSocket socket(sa);

    socket.connect(sa);

    std::string data("hello, world");
    socket.sendBytes(data.data(), (int)data.size());

    cout << "Message successfully sent" << endl;

    uninitializeSSL();
}

我找不到任何我可以设置的API或传递psk_server_cb / psk_client_cb函数指针。

1 个答案:

答案 0 :(得分:0)

  

是否可以支持PSK SSL / TLS?如果是的话,我该怎么做?还是有任何提示?

是的,可以使用SSL / TLS。

这是在OpenSSL中使用预共享密钥的方法。您可以在TLS Client

中使用此技术
const char* const PREFERRED_CIPHERS = "PSK";
res = SSL_set_cipher_list(ssl, PREFERRED_CIPHERS);
if(res != 1) handleFailure();

从字符串创建的密码列表是:

$ openssl ciphers 'PSK'
PSK-AES256-CBC-SHA:PSK-AES128-CBC-SHA:PSK-RC4-SHA:PSK-3DES-EDE-CBC-SHA

你可以用以下方法杀死弱/受伤的密码:

const char* const PREFERRED_CIPHERS = "PSK:!3DES:!RC4";
res = SSL_set_cipher_list(ssl, PREFERRED_CIPHERS);
if(res != 1) handleFailure();

结果是:

$ openssl ciphers 'PSK:!3DES:!RC4'
PSK-AES256-CBC-SHA:PSK-AES128-CBC-SHA

我不知道如何在Poco中做同样的事情。我似乎记得曾经在Poco中处理过所有SSL / TLS的源文件。您应该可以毫不费力地将上述更改应用于Poco源。