Пакет Python для "запросов" генерирует исключение SSL, когда для проверки установлено значение False (в Apache Nifi)
У меня есть процессор ExecuteScript для NIFI, который выполняет следующий сценарий:
import requests
импорт json импорт логирование
postMap = {'a': ' https://a/v/1', 'b': ' https://b/v/2'}
flowFile = session.get () if (flowFile! = None):
title = flowFile.getAttribute('title')
tag = flowFile.getAttribute('tag')
link = flowFile.getAttribute('link')
descp = flowFile.getAttribute('descp')
url = _postMap.get(tag)
headers = { 'content-type': "application/json", 'cache-control': "no-cache" }
payload = { "text": "You have a new Notification",
"attachments": [
{
"title": title,
"title_link": link,
"text": descp,
"color": "#764FA5"
}
]
}
logging.error(json.dumps(payload))
response = requests.post(url, headers=headers, verify=False, data=json.dumps(payload))
flowFile = session.putAttribute(flowFile, "status","posted")
session.transfer(flowFile, REL_SUCCESS)
session.commit()
Теперь, несмотря на то, что verify=False, я получаю эту ошибку:
ExecuteScript[id=9af4a34e-0158-1000-7cf5-2beca58c972e] ExecuteScript[id=9af4a34e-0158-1000-7cf5-2beca58c972e] failed to process due to org.apache.nifi.processor.exception.ProcessException: javax.script.ScriptException: requests.exceptions.SSLError: [Errno 1] General SSLEngine problem (javax.net.ssl.SSLHandshakeException: General SSLEngine problem) in <script> at line number 61; rolling back session: org.apache.nifi.processor.exception.ProcessException: javax.script.ScriptException: requests.exceptions.SSLError: [Errno 1] General SSLEngine problem (javax.net.ssl.SSLHandshakeException: General SSLEngine problem) in <script> at line number 61
Что может быть причиной этого?
1 ответ
Основная причина, кажется, установлена: механизм сценариев Python от NiFi на самом деле является Jython, а не cpython, как обычно считается. Теперь мы подошли к тому, как Jython создает проблему? Итак, в основном Jython - это Python, работающий внутри JVM, и JVM никогда не позволяет обходить проверку сертификатов SSL без явной записи собственного диспетчера доверия, который возвращает значение true для всех сертификатов.
Я наткнулся на несколько постов в Google, реализующих собственный TrustManager. Для справки:
import java.net.Socket;
import java.security.KeyStore;
import java.security.Provider;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import javax.net.ssl.ManagerFactoryParameters;
import javax.net.ssl.SSLEngine;
import javax.net.ssl.TrustManager;
import javax.net.ssl.TrustManagerFactorySpi;
import javax.net.ssl.X509ExtendedTrustManager;
public class MyProvider extends Provider {
public MyProvider() {
super("MyProvider", 1.0, "Trust certificates");
put("TrustManagerFactory.TrustAllCertificates", MyTrustManagerFactory.class.getName());
}
public static class MyTrustManagerFactory extends TrustManagerFactorySpi {
public MyTrustManagerFactory() {}
protected void engineInit( KeyStore keystore ) {}
protected void engineInit(ManagerFactoryParameters mgrparams ) {}
protected TrustManager[] engineGetTrustManagers() {
return new TrustManager[] {
new X509ExtendedTrustManager() {
@Override
public void checkClientTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {}
@Override
public void checkServerTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {}
@Override
public X509Certificate[] getAcceptedIssuers() {
return null;
}
@Override
public void checkClientTrusted(X509Certificate[] x509Certificates, String s, Socket socket) throws CertificateException {}
@Override
public void checkServerTrusted(X509Certificate[] x509Certificates, String s, Socket socket) throws CertificateException {}
@Override
public void checkClientTrusted(X509Certificate[] x509Certificates, String s, SSLEngine sslEngine) throws CertificateException {}
@Override
public void checkServerTrusted(X509Certificate[] x509Certificates, String s, SSLEngine sslEngine) throws CertificateException {}
}
};
}
}
}
Однако объект MyProvider, включенный в JVM Nifi, не обеспечивает назначенный эффект, работая над ним, должен разрешиться и вскоре вернуться с ответом.