SSLHandshakeException при отправке на сайт https [duplicate]

Добавление случая, когда имя класса для объекта, используемого в структуре сущности, такое же, как имя класса для файла с кодировкой веб-формы.

Предположим, у вас есть веб-форма Contact.aspx, чей класс codebehind Свяжитесь с вами, и у вас есть имя объекта Contact.

Затем следующий код вызовет исключение NullReferenceException при вызове context.SaveChanges ()

Contact contact = new Contact { Name = "Abhinav"};
var context = new DataContext();
context.Contacts.Add(contact);
context.SaveChanges(); // NullReferenceException at this line

Ради полноты класса DataContext

public class DataContext : DbContext 
{
    public DbSet Contacts {get; set;}
}

и класс сущности контакта. Иногда классы сущностей являются частичными классами, так что вы можете распространять их и в других файлах.

public partial class Contact 
{
    public string Name {get; set;}
}

Ошибка возникает, когда оба класса entity и codebehind находятся в одном и том же пространстве имен. Чтобы исправить это, переименуйте класс сущности или класс codebehind для Contact.aspx.

Причина. Я все еще не уверен в причине. Но всякий раз, когда какой-либо из классов сущностей расширяет System.Web.UI.Page, возникает эта ошибка.

Для обсуждения рассмотрим NullReferenceException в DbContext.saveChanges ()

75
задан javanna 12 July 2011 в 10:14
поделиться

6 ответов

Сначала вам нужно получить общедоступный сертификат с сервера, к которому вы пытаетесь подключиться. Это можно сделать разными способами, например, связаться с администратором сервера и запросить его, с помощью openssl, чтобы загрузить его , или, поскольку это, как представляется, HTTP-сервер, подключающийся к нему с помощью любого браузера, просмотра информации о безопасности страницы и сохранения копии сертификата. (Google должен уметь точно сказать, что делать для вашего конкретного браузера.)

Теперь, когда у вас есть сертификат, сохраненный в файле, вам нужно добавить его в хранилище доверия JVM. В $JAVA_HOME/jre/lib/security/ для JRE или $JAVA_HOME/lib/security для JDK есть файл с именем cacerts, который поставляется с Java и содержит общедоступные сертификаты известных сертифицирующих органов. Чтобы импортировать новый сертификат, запустите keytool как пользователь, у которого есть разрешение на запись в cacerts:

keytool -import -file <the cert file> -alias <some meaningful name> -keystore <path to cacerts file>

Скорее всего, он попросит вас ввести пароль. Пароль по умолчанию, поставляемый с java, - changeit. Его почти никто не изменяет. После того, как вы выполните эти относительно простые шаги, вы будете уверенно общаться и с уверенностью, что разговариваете с нужным сервером и только с правильным сервером (пока они не потеряют свой закрытый ключ).

114
ответ дан Alastair McCormack 27 August 2018 в 09:56
поделиться

Теперь я решил эту проблему таким образом,

import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import java.io.OutputStream; 

// Create a trust manager that does not validate certificate chains like the default 

TrustManager[] trustAllCerts = new TrustManager[]{
        new X509TrustManager() {

            public java.security.cert.X509Certificate[] getAcceptedIssuers()
            {
                return null;
            }
            public void checkClientTrusted(java.security.cert.X509Certificate[] certs, String authType)
            {
                //No need to implement.
            }
            public void checkServerTrusted(java.security.cert.X509Certificate[] certs, String authType)
            {
                //No need to implement.
            }
        }
};

// Install the all-trusting trust manager
try 
{
    SSLContext sc = SSLContext.getInstance("SSL");
    sc.init(null, trustAllCerts, new java.security.SecureRandom());
    HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
} 
catch (Exception e) 
{
    System.out.println(e);
}

Конечно, это решение должно использоваться только в сценариях, где невозможно установить требуемые сертификаты с помощью keytool, например. локальное тестирование с временными сертификатами.

14
ответ дан Alexander Farber 27 August 2018 в 09:56
поделиться

Всякий раз, когда мы пытаемся подключиться к URL-адресу,

, если сервер на другом сайте работает по протоколу https и обязателен для связи через информацию, предоставленную в сертификате, у нас есть следующая опция:

1) запросить сертификат (загрузить сертификат), импортировать этот сертификат в доверенность. По умолчанию для использования функции доверия по умолчанию java можно найти в \ Java \ jdk1.6.0_29 \ jre \ lib \ security \ cacerts, тогда если мы попытаемся подключиться к URL-соединению, будет принято.

2) В обычном бизнесе мы можем подключаться к внутренним URL-адресам в организациях, и мы знаем, что они верны. В таких случаях вы доверяете правильному URL-адресу. В таких случаях выше может использоваться код, который не будет указывать на сохранение сертификата для подключения к определенному URL-адресу.

для точки 2 для выполнения следующих шагов:

1) напишите ниже метод, который устанавливает HostnameVerifier для HttpsURLConnection, который возвращает true для всех случаев, то есть мы доверяем trustStore.

  // trusting all certificate 
 public void doTrustToCertificates() throws Exception {
        Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());
        TrustManager[] trustAllCerts = new TrustManager[]{
                new X509TrustManager() {
                    public X509Certificate[] getAcceptedIssuers() {
                        return null;
                    }

                    public void checkServerTrusted(X509Certificate[] certs, String authType) throws CertificateException {
                        return;
                    }

                    public void checkClientTrusted(X509Certificate[] certs, String authType) throws CertificateException {
                        return;
                    }
                }
        };

        SSLContext sc = SSLContext.getInstance("SSL");
        sc.init(null, trustAllCerts, new SecureRandom());
        HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
        HostnameVerifier hv = new HostnameVerifier() {
            public boolean verify(String urlHostName, SSLSession session) {
                if (!urlHostName.equalsIgnoreCase(session.getPeerHost())) {
                    System.out.println("Warning: URL host '" + urlHostName + "' is different to SSLSession host '" + session.getPeerHost() + "'.");
                }
                return true;
            }
        };
        HttpsURLConnection.setDefaultHostnameVerifier(hv);
    }

2) напишите ниже метод , который вызывает doTrustToCertificates перед попыткой подключиться к URL

    // connecting to URL
    public void connectToUrl(){
     doTrustToCertificates();//  
     URL url = new URL("https://www.example.com");
     HttpURLConnection conn = (HttpURLConnection)url.openConnection(); 
     System.out.println("ResponseCode ="+conn.getResponseCode());
   }

Этот вызов вернет код ответа = 200 означает, что соединение выполнено успешно.

Для получения более подробной информации и примера примера вы можете обратиться к URL .

10
ответ дан AndreyAkinshin 27 August 2018 в 09:56
поделиться

SSLHandshakeException может быть разрешен двумя способами.

  1. Включение SSL Получение SSL (путем запроса администратора системного администратора, также может быть загружено командой openssl, или любые браузеры загружают сертификаты). Добавьте сертификат в truststore (cacerts), расположенный в JRE / lib / security, предоставляет местоположение доверия в аргументах vm как «-Djavax.net.ssl.trustStore =»
  2. Игнорирование SSL. Для этого # 2, пожалуйста, посетите мой другой ответ на другом веб-сайте stackoverflow: Как проверить SSL-проверку Игнорировать ошибки сертификата SSL с помощью Java
0
ответ дан Community 27 August 2018 в 09:56
поделиться

Я считаю, что вы пытаетесь подключиться к чему-то, используя SSL, но что-то предоставляет сертификат, который не проверяется корневыми органами сертификации, такими как verisign. По сути, по умолчанию безопасные соединения могут быть установлены только в том случае, если человек, пытающийся для подключения знает ключи контрагентов или какой-то другой верндор, например verisign, может вмешаться и сказать, что предоставленный публичный ключ действительно прав.

Надежность всех ОС. Несколько авторитетных центров сертификации и более мелких эмитентов сертификатов должны быть сертифицированным одним из крупных сертификаторов, создающим цепочку сертификаторов, если вы понимаете, что я имею в виду ...

В любом случае вернемся к делу. У меня была аналогичная проблема при программировании Java-апплета и Java сервер. (Надеюсь, когда-нибудь я напишу полный блог-блог о том, как я получил всю безопасность для работы :))

По сути, мне нужно было извлечь открытые ключи с сервера и сохранить их в хранилище ключей внутри моего апплета и когда я подключился на сервер я использовал этот хранилище ключей для создания фабрики доверия и фабрики доверия для создания соединения ssl. Существуют также альтернативные процедуры, такие как добавление ключа к доверенному хосту JVM и изменение хранилища доверия по умолчанию при запуске.

Я сделал это примерно два месяца назад и не имею исходного кода для меня прямо сейчас .. используйте Google, и вы должны решить эту проблему. Если вы не можете передать мне сообщение, и я могу предоставить вам соответствующий исходный код для проекта. Не знаете, решает ли эта проблема вашу проблему, поскольку вы не предоставили код, который вызывает эти исключения. Кроме того, я работал с апплетами, я думал, что не могу понять, почему это не работает на Serverlets ...

P.S Я не могу получить исходный код перед выходными, так как внешний SSH отключен в моем офисе: (

0
ответ дан Osama Javed 27 August 2018 в 09:56
поделиться

Теперь я решил эту проблему таким образом,

import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import java.io.OutputStream;
// Create a trust manager that does not validate certificate chains like the 
default TrustManager[] trustAllCerts = new TrustManager[] {
    new X509TrustManager() {
        public java.security.cert.X509Certificate[] getAcceptedIssuers() {
            return null;
        }
        public void checkClientTrusted(java.security.cert.X509Certificate[] certs, String authType) {
            //No need to implement. 
        }
        public void checkServerTrusted(java.security.cert.X509Certificate[] certs, String authType) {
            //No need to implement. 
        }
    }
};
// Install the all-trusting trust manager
try {
    SSLContext sc = SSLContext.getInstance("SSL");
    sc.init(null, trustAllCerts, new java.security.SecureRandom());
    HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
} catch (Exception e) {
    System.out.println(e);
}
-3
ответ дан selladurai 27 August 2018 в 09:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: