証明書認証をスキップするような空証明書での HTTPS 通信を Java で書いて、
サンプルを試す先=相手側は、なかなか見つからないものです。
Slack API というのが、HTTPS でした。これなら比較的自由に試せます。。
まずは、常套手段である誰もが以下のような X509証明を勝手にしたことにするクラスを用意します。
import java.security.cert.CertificateException; import java.security.cert.X509Certificate; import javax.net.ssl.X509TrustManager; public class NonAuthentication implements X509TrustManager{ /* @see javax.net.ssl.X509TrustManager#checkClientTrusted(java.security.cert.X509Certificate[], java.lang.String) */ @Override public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException{ } /* @see javax.net.ssl.X509TrustManager#checkServerTrusted(java.security.cert.X509Certificate[], java.lang.String) */ @Override public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException{ } /* @see javax.net.ssl.X509TrustManager#getAcceptedIssuers() */ @Override public X509Certificate[] getAcceptedIssuers(){ return null; } }
これを使い、SSLSocketFactory からSSL通信します。
URL Slacack APIの途中までは、固定なはずなので、固定にしてます。
通信のタイムアウトを60秒にします。
今回は、プロキシを間に指定しません。
結果の受け取りは、文字列です。
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.net.MalformedURLException; import java.net.URL; import java.net.URLEncoder; import java.security.KeyManagementException; import java.security.NoSuchAlgorithmException; import java.util.HashMap; import java.util.Map; import java.util.stream.Collectors; import javax.net.ssl.HttpsURLConnection; import javax.net.ssl.SSLContext; import javax.net.ssl.SSLSocketFactory; import javax.net.ssl.X509TrustManager; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * Slack APIへ問い合わせ、 application/x-www-form-urlencoded */ public class SlackQuery{ Logger logger = LoggerFactory.getLogger(this.getClass()); private String token; public SlackQuery(String token){ this.token = token; } public String query(String apiname, String method, Map<String, String> params) throws IOException{ String result = null; try{ SSLContext ctx = SSLContext.getInstance("SSL"); ctx.init(null, new X509TrustManager[]{ new NonAuthentication() }, null); SSLSocketFactory factory = ctx.getSocketFactory(); URL url = new URL("https://slack.com/api/" + apiname); HttpsURLConnection uc = (HttpsURLConnection)url.openConnection(); uc.setSSLSocketFactory(factory); /* HTTPリクエストヘッダの設定 */ uc.setDoOutput(true); // こちらからのデータ送信を可能とする uc.setReadTimeout(60 * 1000); // 読み取りタイムアウト値 uc.setRequestMethod(method); // URL 要求メソッドを設定 Map<String, String> parameters = new HashMap<>(); parameters.put("token", token); params.entrySet().stream().forEach(e->{ try{ parameters.put(e.getKey(), URLEncoder.encode(e.getValue(), "UTF-8")); }catch(Exception ex){ logger.warn(ex.getMessage(), ex); } }); String sendstring = parameters.entrySet().stream().map(e->e.getKey() + "=" + e.getValue()).collect(Collectors.joining("&")); uc.setRequestProperty("Content-Length", Integer.toString(sendstring.getBytes("utf8").length)); // コネクション確立→送信 uc.connect(); OutputStreamWriter osw = new OutputStreamWriter(uc.getOutputStream(), "utf8"); osw.write(sendstring); osw.flush(); int httpresponsecode = uc.getResponseCode(); logger.debug("# HTTP response code : " + httpresponsecode ); // 戻り値取得 uc.getHeaderFields().entrySet().stream().forEach(e->{ logger.debug("# "+ e.getKey() + " → " + e.getValue() ); }); // 応答読込 try(BufferedReader in = new BufferedReader(new InputStreamReader(uc.getInputStream(), "utf8"))){ StringBuilder out = new StringBuilder(); char[] buf = new char[1024]; int n; while((n = in.read(buf)) >= 0){ out.append(buf, 0, n); } result = out.toString(); }catch(IOException e){ throw new RuntimeException(e); } }catch(NoSuchAlgorithmException | KeyManagementException| MalformedURLException ex){ logger.error(ex.getMessage(), ex); } return result; } }
Slack の管理ページから、問い合わせ対象のチームの トークンを取得しておきます。
取得したトークンで実行します
SlackQuery sq = new SlackQuery("xoxp-XXXXXXXXXX-XXXXXXXXXX-XXXXXXXXXX-XXXXXXXXXXXX"); String res = sq.query("groups.list", "GET", new HashMap<>());
結果は、JSON文字列になります。