openSSL 1.1.1 API 疑惑
openSSL 1.1.1 API Doubts
我想使用 openSSL 1.1.1 为我的项目设置和 运行 SSL 客户端和服务器与 TLS 1.2。
我对 openSSL 的 and/or 要求有一些疑问:
select TLS 1.2 作为版本的正确方法是什么?目前我正在使用 TLS_client_method()。其他方法似乎已被弃用。有选择特定版本的特定API吗?
我需要 运行 一个带有以下握手扩展的 SSL 客户端。
- ec_point_formats 以“未压缩”为值
- supported_groups 包含“secp521r”、“secp384r1”、“secp256r1”、“secp224r1”、“secp192r1”、“secp160r1”、“ffdhe2048”的列表
- encrypt_then_mac 值为 0
- server_name
- extended_master_secret 没有任何值和长度设置为 0
我需要 运行 具有以下握手扩展的 SSL 服务器
- encrypt_then_mac 值为 0
- extended_master_secret 没有任何值和长度设置为 0
除了上述 header 扩展字段外,我想禁用其他所有内容。如何实现?
从客户端我只想提供“TLS_PSK_WITH_AES_128_CBC_SHA256”密码套件作为选项。
使用 PSK 密码时,成功建立连接和通信是否需要客户端证书和密钥文件 (pem)?
是否有使用 PSK 身份验证的示例或开源 client-server 实现?
what is the right way to select TLS 1.2 as version? Currently I am using TLS_client_method(). the other methods seem to be deprecated. Is there a specific API for choosing particular version?
TLS_client_method()
才是正确的使用方法。要指定不使用低于 TLSv1.2 的版本,您应该这样做:
SSL_CTX_set_min_proto_version(ctx, TLS1_2_VERSION);
其中 ctx
是您的 SSL_CTX
对象。
如果您还想防止使用高于 TLSv1.2 的任何内容,请执行以下操作:
SSL_CTX_set_max_proto_version(ctx, TLS1_2_VERSION);
有关这些呼叫的信息,请参阅此页面:
https://www.openssl.org/docs/man1.1.1/man3/SSL_CTX_set_min_proto_version.html
I need to run an SSL clinet with following handshake extensions.
- ec_point_formats with "uncompressed" as value
- supported_groups with list of "secp521r","secp384r1","secp256r1","secp224r1","secp192r1","secp160r1","ffdhe2048"
如果您指定了您选择的 PSK 密码套件,则不会使用这些扩展,因此 OpenSSL 不会发送它们(假设您已经如上所述限制了最大 TLS 协议版本,并且只配置了该密码套件).这样做毫无意义。即使支持,OpenSSL 1.1.1 也不支持“ffdhe2048”。它确实支持所有其他的。
- encrypt_then_mac with value 0
不确定您所说的“值为 0”是什么意思,因为此扩展名始终为空且没有任何值。我假设您的意思是长度为 0。默认情况下会发送此扩展,因此您无需执行任何操作。
- server_name
您应该致电:
SSL_set_tlsext_host_name(ssl, "hostname of the server");
其中 ssl
是您的 SSL
对象,并将“服务器的主机名”替换为服务器的真实主机名。
有关此电话的信息,请参阅此页面:
https://www.openssl.org/docs/man1.1.1/man3/SSL_set_tlsext_host_name.html
- extended_master_secret without any value and length set to 0
此分机是默认发送的,因此您无需执行任何操作。
I need to run an SSL server with following handshake extensions
- encrypt_then_mac with value 0
- extended_master_secret without any value and length set to 0
如果客户端发送了它们,那么服务器将默认回显它们。您无需执行任何操作。
Apart from above header extension fields I want to disable everything else. How to accomplish that?
OpenSSL 客户端将另外发送 session_ticket
扩展名。它无害,但如果你真的想禁用它,你可以这样做:
SSL_CTX_set_options(ctx, SSL_OP_NO_TICKET);
有关详细信息,请参阅此页面:
https://www.openssl.org/docs/man1.1.1/man3/SSL_CTX_set_options.html
OpenSSL 服务器将另外发送“重新协商”扩展。你不能禁用它(事实上你不能)。忽略它。它是无害的。
From client I want to provide only "TLS_PSK_WITH_AES_128_CBC_SHA256" cipher suite as option.
这是密码套件的官方 IANA 名称。 OpenSSL 将其识别为“PSK-AES128-CBC-SHA256”。
像这样在客户端和服务器上配置它:
SSL_CTX_set_cipher_list(ctx, "PSK-AES128-CBC-SHA256");
有关详细信息,请参阅此页面:
https://www.openssl.org/docs/man1.1.1/man3/SSL_CTX_set_cipher_list.html
此外,您需要提供 PSK 回调以告知 OpenSSL 您要使用的 PSK 是什么。
在客户端你需要调用SSL_CTX_set_psk_client_callback()
。在服务器上你必须调用 SSL_CTX_set_psk_server_callback()
.
有关详细信息,请参阅以下页面:
https://www.openssl.org/docs/man1.1.1/man3/SSL_CTX_set_psk_client_callback.html
https://www.openssl.org/docs/man1.1.1/man3/SSL_CTX_set_psk_server_callback.html
TLSv1.3 密码套件仍将自动发送,除非您如上所述将最大 TLS 协议版本另外限制为 TLSv1.2。最后,您还将看到一个名为“TLS_EMPTY_RENEGOTIATION_INFO_SCSV”的密码组被发送。这实际上根本不是一个真正的密码套件。它总是被发送并且不能被抑制。它永远不会被谈判并且是无害的。忽略它。
Is client certificate and key files (pem) necessary for successful connection establishment and communication when PSK cipher is used?
没有
Is there any example or open source client-server implementation with PSK authentication?
你可以看看s_client和s_server是怎么做的:
https://github.com/openssl/openssl/blob/OpenSSL_1_1_1-stable/apps/s_client.c
https://github.com/openssl/openssl/blob/OpenSSL_1_1_1-stable/apps/s_server.c
我想使用 openSSL 1.1.1 为我的项目设置和 运行 SSL 客户端和服务器与 TLS 1.2。
我对 openSSL 的 and/or 要求有一些疑问:
select TLS 1.2 作为版本的正确方法是什么?目前我正在使用 TLS_client_method()。其他方法似乎已被弃用。有选择特定版本的特定API吗?
我需要 运行 一个带有以下握手扩展的 SSL 客户端。
- ec_point_formats 以“未压缩”为值
- supported_groups 包含“secp521r”、“secp384r1”、“secp256r1”、“secp224r1”、“secp192r1”、“secp160r1”、“ffdhe2048”的列表
- encrypt_then_mac 值为 0
- server_name
- extended_master_secret 没有任何值和长度设置为 0
我需要 运行 具有以下握手扩展的 SSL 服务器
- encrypt_then_mac 值为 0
- extended_master_secret 没有任何值和长度设置为 0
除了上述 header 扩展字段外,我想禁用其他所有内容。如何实现?
从客户端我只想提供“TLS_PSK_WITH_AES_128_CBC_SHA256”密码套件作为选项。
使用 PSK 密码时,成功建立连接和通信是否需要客户端证书和密钥文件 (pem)?
是否有使用 PSK 身份验证的示例或开源 client-server 实现?
what is the right way to select TLS 1.2 as version? Currently I am using TLS_client_method(). the other methods seem to be deprecated. Is there a specific API for choosing particular version?
TLS_client_method()
才是正确的使用方法。要指定不使用低于 TLSv1.2 的版本,您应该这样做:
SSL_CTX_set_min_proto_version(ctx, TLS1_2_VERSION);
其中 ctx
是您的 SSL_CTX
对象。
如果您还想防止使用高于 TLSv1.2 的任何内容,请执行以下操作:
SSL_CTX_set_max_proto_version(ctx, TLS1_2_VERSION);
有关这些呼叫的信息,请参阅此页面: https://www.openssl.org/docs/man1.1.1/man3/SSL_CTX_set_min_proto_version.html
I need to run an SSL clinet with following handshake extensions.
- ec_point_formats with "uncompressed" as value
- supported_groups with list of "secp521r","secp384r1","secp256r1","secp224r1","secp192r1","secp160r1","ffdhe2048"
如果您指定了您选择的 PSK 密码套件,则不会使用这些扩展,因此 OpenSSL 不会发送它们(假设您已经如上所述限制了最大 TLS 协议版本,并且只配置了该密码套件).这样做毫无意义。即使支持,OpenSSL 1.1.1 也不支持“ffdhe2048”。它确实支持所有其他的。
- encrypt_then_mac with value 0
不确定您所说的“值为 0”是什么意思,因为此扩展名始终为空且没有任何值。我假设您的意思是长度为 0。默认情况下会发送此扩展,因此您无需执行任何操作。
- server_name
您应该致电:
SSL_set_tlsext_host_name(ssl, "hostname of the server");
其中 ssl
是您的 SSL
对象,并将“服务器的主机名”替换为服务器的真实主机名。
有关此电话的信息,请参阅此页面: https://www.openssl.org/docs/man1.1.1/man3/SSL_set_tlsext_host_name.html
- extended_master_secret without any value and length set to 0
此分机是默认发送的,因此您无需执行任何操作。
I need to run an SSL server with following handshake extensions
- encrypt_then_mac with value 0
- extended_master_secret without any value and length set to 0
如果客户端发送了它们,那么服务器将默认回显它们。您无需执行任何操作。
Apart from above header extension fields I want to disable everything else. How to accomplish that?
OpenSSL 客户端将另外发送 session_ticket
扩展名。它无害,但如果你真的想禁用它,你可以这样做:
SSL_CTX_set_options(ctx, SSL_OP_NO_TICKET);
有关详细信息,请参阅此页面: https://www.openssl.org/docs/man1.1.1/man3/SSL_CTX_set_options.html
OpenSSL 服务器将另外发送“重新协商”扩展。你不能禁用它(事实上你不能)。忽略它。它是无害的。
From client I want to provide only "TLS_PSK_WITH_AES_128_CBC_SHA256" cipher suite as option.
这是密码套件的官方 IANA 名称。 OpenSSL 将其识别为“PSK-AES128-CBC-SHA256”。
像这样在客户端和服务器上配置它:
SSL_CTX_set_cipher_list(ctx, "PSK-AES128-CBC-SHA256");
有关详细信息,请参阅此页面: https://www.openssl.org/docs/man1.1.1/man3/SSL_CTX_set_cipher_list.html
此外,您需要提供 PSK 回调以告知 OpenSSL 您要使用的 PSK 是什么。
在客户端你需要调用SSL_CTX_set_psk_client_callback()
。在服务器上你必须调用 SSL_CTX_set_psk_server_callback()
.
有关详细信息,请参阅以下页面: https://www.openssl.org/docs/man1.1.1/man3/SSL_CTX_set_psk_client_callback.html https://www.openssl.org/docs/man1.1.1/man3/SSL_CTX_set_psk_server_callback.html
TLSv1.3 密码套件仍将自动发送,除非您如上所述将最大 TLS 协议版本另外限制为 TLSv1.2。最后,您还将看到一个名为“TLS_EMPTY_RENEGOTIATION_INFO_SCSV”的密码组被发送。这实际上根本不是一个真正的密码套件。它总是被发送并且不能被抑制。它永远不会被谈判并且是无害的。忽略它。
Is client certificate and key files (pem) necessary for successful connection establishment and communication when PSK cipher is used?
没有
Is there any example or open source client-server implementation with PSK authentication?
你可以看看s_client和s_server是怎么做的:
https://github.com/openssl/openssl/blob/OpenSSL_1_1_1-stable/apps/s_client.c https://github.com/openssl/openssl/blob/OpenSSL_1_1_1-stable/apps/s_server.c