Monthly Archives: April 2013

SSH Tunnel в HeidiSQL

Решил написать эту статью под впечатлением нескольких часов проведенных в поисках проблем с подключением к базе через SSH Tunnel в HeidiSQL.

Если есть доступ к серверу по SSH , то гораздо удобней работать с базой через HeidiSQL, чем скажем через phpMyAdmin.

Итак настройка подключения:
1) вкладка Settings: heidisql settings
Здесь указываем параметры подключения к базе из конфига CMS.

2) вкладка SSH tunnel: heidisql ssh tunnel
plink.exe можно взять тут, и дальше host, port, user, password от ssh.

Если после этого вам удастся подключиться к базе, значит вам повезло и можно дальше не читать.

У меня была ошибка:
SQL Error (2003): Can't connect to MySQL server on 'localhost' (10061)

Запускаем консоль, заходим в папку где лежит plink.exe и вводим:

  > plink.exe  -ssh  server_user@server_host  -pw  “server_pass”  -P 22 -N -L  3307:localhost:3306 

При первом соединении plink спрашивает доверяем ли мы серверу с данным key fingerprint, соглашаемся. После чего plink заносит этот ключ в реестр windows в HKEY_CURRENT_USER\Software\SimonTatham\PuTTY\SshHostKeys ( что можно увидеть используя утилиту windows regedit )

После этого идем в HeidiSQL и пробуем конектится, в моем случае все прошло успешно.

Если у вас установлен ssh клиент putty (или WinSCP, с которым иногда устанавливается и putty) то этаже ошибка может возникать из за того что plink использует настройки заданные в putty. В этом случае может помочь следующее:
1) Запускаем putty и в его настройках указываем Connect type – любой не ssh ( например Telnet ), сохраняем настройки.
2) Идем в HeidiSQL и на вкладке SSH tunnel в поле plink.exe location через пробел указываем флаг -ssh , сохраняемся, пробуем соединиться.

Вот и все, всем удачи и поменьше таких проблем :) .

Эта проблема также обсуждалась тут.

Инициализация java класса org.apache.http.client.HttpClient для работы с https

Ниже привожу пример инициализации HttpClient для https доверяющего всем сертификатам

import org.apache.http.client.HttpClient;
import org.apache.http.conn.ClientConnectionManager;
import org.apache.http.conn.scheme.Scheme;
import org.apache.http.conn.scheme.SchemeRegistry;
import org.apache.http.conn.ssl.SSLSocketFactory;
import org.apache.http.conn.ssl.X509HostnameVerifier;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.impl.conn.BasicClientConnectionManager;

import java.security.NoSuchAlgorithmException;
import java.security.KeyManagementException;
import java.security.cert.X509Certificate; 
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import javax.net.ssl.SSLContext; 
import javax.net.ssl.HostnameVerifier;


    
public MyHttpClient
{
    .......

    private HttpClient getHttpClient(boolean isHttps)
    {
        if(isHttps)
        {
            // Create a trust manager that does not validate certificate chains
            TrustManager[] trustAllCerts = new TrustManager[] { 
                new X509TrustManager() {
                @Override
                public X509Certificate[] getAcceptedIssuers() { 
                    return new X509Certificate[0]; 
                }
                
                @Override
                public void checkClientTrusted(X509Certificate[] certs, String authType) {}
                
                @Override
                public void checkServerTrusted(X509Certificate[] certs, String authType) {}
            }};

            SSLContext sslContext;
            try {
                sslContext = SSLContext.getInstance("SSL");
            } catch (NoSuchAlgorithmException e) { //  if no Provider supports a TrustManagerFactorySpi implementation for the specified protocol.
                System.out.println(e.getMessage());
                return null;
            }
            
            try {
                sslContext.init(null, trustAllCerts, new SecureRandom());
            } catch (KeyManagementException e) {
                System.out.println(e.getMessage());
                return null;
            }
            
            HostnameVerifier hostnameVerifier = org.apache.http.conn.ssl.SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER;
            SSLSocketFactory sf = new SSLSocketFactory(sslContext, (X509HostnameVerifier)hostnameVerifier);
            
            Scheme httpsScheme = new Scheme("https", 443, sf);
            SchemeRegistry schemeRegistry = new SchemeRegistry();
            schemeRegistry.register(httpsScheme);

            ClientConnectionManager cm = new BasicClientConnectionManager(schemeRegistry);
            return new DefaultHttpClient(cm);
        } 
        else
        {
            return new DefaultHttpClient();
        }    
    }        
}