GVKun编程网logo

在Python中打开SSL套接字连接(python import ssl)

14

对于在Python中打开SSL套接字连接感兴趣的读者,本文将提供您所需要的所有信息,我们将详细讲解pythonimportssl,并且为您提供关于java–SSL套接字连接、Java中的密钥SSL套接

对于在Python中打开SSL套接字连接感兴趣的读者,本文将提供您所需要的所有信息,我们将详细讲解python import ssl,并且为您提供关于java – SSL套接字连接、Java中的密钥SSL套接字连接、PHP在Python中打开SSL AES、Python 套接字连接无法通过本地网络的宝贵知识。

本文目录一览:

在Python中打开SSL套接字连接(python import ssl)

在Python中打开SSL套接字连接(python import ssl)

我正在尝试在Python中建立安全的套接字连接,而使用SSL有点麻烦。我已经找到一些有关如何与SSL建立连接的代码示例,但它们都涉及密钥文件。我尝试连接的服务器不需要接收任何密钥或证书。我的问题是,我该如何实质上包装带有SSL的python套接字连接。我知道我应该使用的密码是ADH-AES256-SHA,协议是TLSv1。这就是我一直在尝试的:

import socketimport ssl# SET VARIABLESpacket, reply = "<packet>SOME_DATA</packet>", ""HOST, PORT = ''XX.XX.XX.XX'', 4434# CREATE SOCKETsock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)sock.settimeout(10)# WRAP SOCKET ???ssl.wrap_socket(sock, ssl_version="TLSv1", ciphers="ADH-AES256-SHA")# CONNECT AND PRINT REPLYsock.connect((HOST, PORT))sock.send(packet)print sock.recv(1280)# CLOSE SOCKET CONNECTIONsock.close()

运行此代码时,没有任何错误,但响应为空。当尝试在命令行中调试此代码时,通过在python终端中键入并逐行粘贴代码,我得到的是我在运行时假设的状态代码sock.send(packet)。我得到的整数响应是26。如果有人知道这意味着什么,或者可以提供任何帮助,将不胜感激。提前致谢!

答案1

小编典典

好的,我找出了问题所在。我真是愚蠢。two我的代码有问题。我的第一个错误是在指定应该ssl_version放入的时间TLSv1ssl.PROTOCOL_TLSv1。第二个错误是我没有引用包装好的套接字,而是调用了我创建的原始套接字。下面的代码似乎对我有用。

import socketimport ssl# SET VARIABLESpacket, reply = "<packet>SOME_DATA</packet>", ""HOST, PORT = ''XX.XX.XX.XX'', 4434# CREATE SOCKETsock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)sock.settimeout(10)# WRAP SOCKETwrappedSocket = ssl.wrap_socket(sock, ssl_version=ssl.PROTOCOL_TLSv1, ciphers="ADH-AES256-SHA")# CONNECT AND PRINT REPLYwrappedSocket.connect((HOST, PORT))wrappedSocket.send(packet)print wrappedSocket.recv(1280)# CLOSE SOCKET CONNECTIONwrappedSocket.close()

希望这可以帮助到别人!

java – SSL套接字连接

java – SSL套接字连接

如何创建SSL套接字连接?

我真的需要创建一个密钥库?这个密钥库应该与我的所有客户端应用程序共享?

我用以下代码创建了一个服务器:

SSLServerSocketFactory sslserversocketfactory = (SSLServerSocketFactory) SSLServerSocketFactory
                    .getDefault();
SSLServerSocket sslserversocket = (SSLServerSocket) sslserversocketfactory
                    .createServerSocket(ServerProperties.getInstance()
                            .getVsspAuthenticationPort());

我在android上用以下代码创建了一个客户端:

SSLSocketFactory sslsocketfactory = (SSLSocketFactory) SSLSocketFactory
                .getDefault();
SSLSocket sslsocket = (SSLSocket) sslsocketfactory.createSocket(
                host, authPort);

sslsocket.startHandshake();

BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(
                sslsocket.getoutputStream()));
BufferedReader reader = new BufferedReader(new InputStreamReader(
                sslsocket.getInputStream()));

但是当我尝试连接时,会抛出以下错误:

javax.net.ssl.SSLHandshakeException: no cipher suites in common
    at sun.security.ssl.Alerts.getSSLException(Alerts.java:192)
    at sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1886)
    at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:276)
    at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:266)
    at sun.security.ssl.ServerHandshaker.chooseCipherSuite(ServerHandshaker.java:894)
    at sun.security.ssl.ServerHandshaker.clientHello(ServerHandshaker.java:622)
    at sun.security.ssl.ServerHandshaker.processMessage(ServerHandshaker.java:167)
    at sun.security.ssl.Handshaker.processLoop(Handshaker.java:868)
    at sun.security.ssl.Handshaker.process_record(Handshaker.java:804)
    at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1016)
    at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1312)
    at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1339)
    at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1323)

解决方法:

您需要证书来建立ssl连接,您可以在密钥库中加载证书,也可以自己加载证书.我将展示一些keystore选项的示例.

您的代码需要运行一些参数:

java -Djavax.net.ssl.keyStore=keyStoreFile -Djavax.net.ssl.keyStorePassword=keystorePassword Server

您还可以使用java代码加载密钥库,最简单的解决方案是设置系统属性:

System.setProperty("javax.net.ssl.keyStore", 'keystoreFile');
System.setProperty("javax.net.ssl.keyStorePassword", 'keystorePassword ');

您也可以使用不同的方式加载密钥库,它更复杂,但您可以执行更复杂的操作:

KeyStore ks = KeyStore.getInstance("JKS");
ks.load(new FileInputStream("keystoreFile"), "keystorePassword".tochararray());

KeyManagerFactory kmf = KeyManagerFactory.getInstance("X509");
kmf.init(ks, "keystorePassword".tochararray());

TrustManagerFactory tmf = TrustManagerFactory.getInstance("X509"); 
tmf.init(ks);

SSLContext sc = SSLContext.getInstance("TLS"); 
TrustManager[] trustManagers = tmf.getTrustManagers(); 
sc.init(kmf.getKeyManagers(), trustManagers, null); 

SSLServerSocketFactory ssf = sc.getServerSocketFactory(); 
SSLServerSocket s = (SSLServerSocket) ssf.createServerSocket(serverport);
SSLSocket c = (SSLSocket) s.accept();

对于客户端,代码最后一行有一些变化,最后3行将被替换为:

SSLSocketFactory ssf = sc.getSocketFactory(); 
SSLSocket s = (SSLSocket) ssf.createSocket(serverip, serverport);
s.startHandshake();

如果要为android加载密钥库,则类型必须是“BKS”而不是“JKS”.您可以轻松找到用于创建密钥库的资源.

Java中的密钥SSL套接字连接

Java中的密钥SSL套接字连接

我正在加密服务器和客户端之间的TCP连接。在研究和测试过程中,我倾向于使用秘密密钥加密。我的问题是我找不到有关如何实现此功能的任何教程。我发现的教程围绕一次HTTP请求进行,我只需要一个SSL套接字。

我到目前为止编写的代码如下。我几乎可以肯定它需要扩展,我只是不知道该怎么做。任何帮助表示赞赏。

private ServerSocketFactory factory;
private SSLServerSocket serverSocket;

factory = SSLServerSocketFactory.getDefault();
serverSocket = (SSLServerSocket) factory.createServerSocket( <portNum> );

接受客户端连接的服务器代码

SSLSocket socket = (SSLSocket) serverSocket.accept();
socket.startHandshake();

我只是不知道如何实际进行握手。

参考:http
:
//docs.oracle.com/javase/1.5.0/docs/guide/security/jsse/JSSERefGuide.html

PHP在Python中打开SSL AES

PHP在Python中打开SSL AES

我正在使用PHP用于解密AES-256-CBC消息的项目

<?PHP

class CryptService{
    private static $encryptMethod = 'AES-256-CBC';
    private $key;
    private $iv;

    public function __construct(){
        $this->key = hash('sha256', 'c7b35827805788e77e41c50df44441491098be42');
        $this->iv = substr(hash('sha256', 'c09f6a9e157d253d0b2f0bcd81d338298950f246'), 0, 16);
    }

    public function decrypt($string){
        $string = base64_decode($string);
        return openssl_decrypt($string, self::$encryptMethod, $this->key, 0, $this->iv);
    }

    public function encrypt($string){
        $output = openssl_encrypt($string, self::$encryptMethod, $this->key, 0, $this->iv);
        $output = base64_encode($output);
        return $output;
    }
}

$a = new CryptService;
echo $a->encrypt('secret');
echo "\n";
echo $a->decrypt('S1NaeUFaUHdqc20rQWM1L2ZVMDJudz09');
echo "\n";

产量

>>> S1NaeUFaUHdqc20rQWM1L2ZVMDJudz09
>>> secret

现在,我必须编写用于加密数据的Python 3代码.
我尝试使用PyCrypto,但没有成功.我的代码:

import base64
import hashlib
from Crypto.Cipher import AES

class AESCipher:
    def __init__(self, key, iv):
        self.key = hashlib.sha256(key.encode('utf-8')).digest()
        self.iv = hashlib.sha256(iv.encode('utf-8')).digest()[:16]

    __pad = lambda self,s: s + (AES.block_size - len(s) % AES.block_size) * chr(AES.block_size - len(s) % AES.block_size)
    __unpad = lambda self,s: s[0:-ord(s[-1])]

    def encrypt( self, raw ):
        raw = self.__pad(raw)
        cipher = AES.new(self.key, AES.MODE_CBC, self.iv)
        return base64.b64encode(cipher.encrypt(raw))

    def decrypt( self, enc ):
        enc = base64.b64decode(enc)
        cipher = AES.new(self.key, AES.MODE_CBC, self.iv )
        return self.__unpad(cipher.decrypt(enc).decode("utf-8"))

cipher = AESCipher('c7b35827805788e77e41c50df44441491098be42', 'c09f6a9e157d253d0b2f0bcd81d338298950f246')

enc_str = cipher.encrypt("secret")
print(enc_str)

输出

>>> b'tnF87LsVAkzkvs+gwpCRMg=='

但是我需要输出S1NaeUFaUHdqc20rQWM1L2ZVMDJudz09,它将PHP解密为秘密.如何修改Python代码以获得预期的输出?

解决方法:

默认情况下,PHP’s hash输出一个十六进制编码的字符串,但是Python的.digest()返回字节.您可能想使用.hexdigest():

def __init__(self, key, iv):
    self.key = hashlib.sha256(key.encode('utf-8')).hexdigest()[:32].encode("utf-8")
    self.iv = hashlib.sha256(iv.encode('utf-8')).hexdigest()[:16].encode("utf-8")

初始化向量(IV)的思想是为使用相同密钥的加密提供随机性.如果您使用相同的IV,则攻击者可能会推断出您两次发送相同的消息.这可以被视为损坏的协议.

IV不应被认为是秘密的,因此您只需将其与密文一起发送即可.通常在加密期间将其添加到密文中,然后在解密之前将其切开.

Python 套接字连接无法通过本地网络

Python 套接字连接无法通过本地网络

您正在侦听并连接到同一个 IP - 您需要在服务器上侦听客户端的 IP(或任何具有正确端口号的 IP)并连接到客户端上的服务器 IP。

例如,如果客户端的 IP 是 1.2.3.4,服务器的 IP 是 1.2.3.5,则

# server side
s.bind(('1.2.3.4',8080))  # CLIENT_IP = '1.2.3.4'; PORT = 8080

# can also be s.bind(('0.0.0.0',8080)) if you don't have anything else connecting
# to this port on the server.
# client side
s.connect(('1.2.3.5',8080))  # SERVER_IP = '1.2.3.5'; PORT = 8080
,

这实际上是一个防火墙问题,我只需要为本地网络禁用 Windows Defender 防火墙,现在一切正常

我们今天的关于在Python中打开SSL套接字连接python import ssl的分享已经告一段落,感谢您的关注,如果您想了解更多关于java – SSL套接字连接、Java中的密钥SSL套接字连接、PHP在Python中打开SSL AES、Python 套接字连接无法通过本地网络的相关信息,请在本站查询。

本文标签: