我需要将SSL套接字连接到SSL服务器。如果服务器的证书是自签名的,则以下脚本将失败。但是如果服务器的证书已签名,它就可以工作。你能帮我解决一下如何使用自签名证书成功连接服务器吗?
main.cpp:(.text+0x5): undefined reference to `glfwInit'
main.cpp:(.text+0x1a): undefined reference to `glfwTerminate'
collect2: error: ld returned 1 exit status
CMakeFiles/Test.dir/build.make:94: recipe for target 'Test' failed
make[2]: *** [Test] Error 1
CMakeFiles/Makefile2:67: recipe for target 'CMakeFiles/Test.dir/all' failed
make[1]: *** [CMakeFiles/Test.dir/all] Error 2
Makefile:83: recipe for target 'all' failed
make: *** [all] Error 2
修改 我得到的输出是异常声明中的内容:
import StringIO
import csv #for csv
from M2Crypto.Err import SSLError
import ssl
import socket
import pprint
import M2Crypto
from M2Crypto import X509, RSA
from datetime import datetime
import MySQLdb
context = ssl.SSLContext(ssl.PROTOCOL_TLSv1_2)
context.verify_mode = ssl.CERT_NONE
host='209.18.59.115'
print 'host is: ', host
port=443
#creating ssl socket
ssock = context.wrap_socket(socket.socket(socket.AF_INET), server_hostname=host)
#ssl connection
try:
ssock.connect((host, port))
except socket.error: #if tls connection is not possible, print error message, then go to next host.
print "Faile connection with: " + host
EDIT2: 追溯是:
host is: 209.18.59.115
Faile connection with: 209.18.59.115
答案 0 :(得分:1)
问题在于这一行: context = ssl.SSLContext(ssl.PROTOCOL_TLSv1_2)
我尝试连接的服务器不支持TLSv1.2。当我将该行更改为以下内容时,它可以正常工作: context = ssl.SSLContext(ssl.PROTOCOL_SSLv23)#we选择SSLv23,因为它与除SSLv2之外的所有版本兼容。
TLS客户端/服务器兼容性表(来源:https://docs.python.org/2/library/ssl.html): 这是一个表格,显示客户端(侧面)中的哪些版本可以连接到服务器中的哪些版本(沿着顶部):
client / server SSLv2 SSLv3 SSLv23 TLSv1 TLSv1.1 TLSv1.2
SSLv2 yes no yes no no no
SSLv3 no yes yes no no no
SSLv23 no yes yes yes yes yes
TLSv1 no no yes yes no no
TLSv1.1 no no yes no yes no
TLSv1.2 no no yes no no yes
因为TLSv23与大多数服务器支持的版本兼容,所以我选择它并且它有效。