인증서 없이 https URL 주소를 호출하고 바이트 스트림을 전송하려면 httpclient를 사용하십시오.
다음과 같이 코드 코드를 복사합니다.
패키지 com.paic.hmreport.metaQ;
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
java.net.URL 가져오기;
import java.security.KeyManagementException;
java.security.KeyStore 가져오기;
import java.security.NoSuchAlgorithmException;
import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession;
import javax.net.ssl.TrustManagerFactory;
import java.security.cert.CertificateException;
java.security.cert.X509Certificate 가져오기;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
org.apache.http.HttpEntity 가져오기;
org.apache.http.HttpResponse 가져오기;
import org.apache.http.client.ClientProtocolException;
org.apache.http.client.methods.HttpPost 가져오기;
org.apache.http.conn.scheme.Scheme 가져오기;
org.apache.http.conn.ssl.SSLSocketFactory 가져오기;
org.apache.http.entity.BufferedHttpEntity 가져오기;
org.apache.http.entity.InputStreamEntity 가져오기;
org.apache.http.entity.StringEntity 가져오기;
org.apache.http.impl.client.DefaultHttpClient 가져오기;
org.apache.commons.logging.Log 가져오기;
org.apache.commons.logging.LogFactory 가져오기;
공개 클래스 HttpsClient {
공용 정적 로그 로그 = LogFactory.getLog(HttpsClient.class);
/* 윈도우용 */
/* 리눅스의 경우 */
/*
* 개인 정적 문자열 CLIENT_CERT_PWD="123456";
* TRUST_CERT_PATH=
* "/wls/bis_emulator/apps/emulator/config/cert/BIS_FRONT_SERVER_STG_BY_ZXC.jks"
* ; 개인 정적 문자열 TRUST_CERT_PWD="123456";
* 클라이언트_인증서_경로=
* "/wls/bis_emulator/apps/emulator/config/cert/EXV_GROUP_EAI_B2B_ZUCHE_100.jks"
* ;
*/
/**
* @param 인수
* @throwsIOException
* @throws ClientProtocolException
* @NoSuchAlgorithmException을 발생시킵니다.
* @throws KeyManagementException
*/
public static void main(String[] args)에서 KeyManagementException이 발생합니다.
NoSuchAlgorithmException, ClientProtocolException, IOException {
// sendMsgOfCert("https://10.25.32.13:8007", "hello world", "123456",
// "kserver.jks", "123456", "tclient.jks");
보내다(
"https://127.0.0.1/hmreport/messageChannel.ac?sign=TEZrSHZJdDNrRFNIb0M0QnJrc3VIdDBJWDRYTTVXZGJYZHlLUkpxQlp6anQyYUJITEpSVWQzOWh4b0RvOW96TGVvN2Z hWEJ3SkZvN0JIZVhhOFRuaWZLY3VwbDExSjg2cjZFMFFvNHV4YktJd3E0T2RvTmVhQzV6NV hNTzJLN1NaNWpoUUhTVTR0NTNEdWFOVHpuZjh1ajA0VUhqaFBWRTJvM0s2dnEyTFVnPQ==",
"안녕하세요!");
}
공개 정적 문자열 sendMsgOfCert(문자열 urlString, 문자열 requestData,
문자열 CLIENT_CERT_PWD, 문자열 CLIENT_CERT_PATH,
문자열 TRUST_CERT_PWD, 문자열 TRUST_CERT_PATH) {
StringBuffer sb = null;
노력하다 {
log.info("https 클라이언트 초기화를 시작합니다!");
SSLContext sslContext = SSLContext.getInstance("SSL");
KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
TrustManagerFactory tmf = TrustManagerFactory
.getInstance("SunX509");
KeyStore ks = KeyStore.getInstance("JKS");
ks.load(ClassLoader.getSystemResourceAsStream(CLIENT_CERT_PATH),
CLIENT_CERT_PWD.toCharArray());
kmf.init(ks, CLIENT_CERT_PWD.toCharArray());
KeyStore tks = KeyStore.getInstance("JKS");
tks.load(ClassLoader.getSystemResourceAsStream(TRUST_CERT_PATH),
TRUST_CERT_PWD.toCharArray());
tmf.init(tks);
sslContext.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);
HostnameVerifier 호스트 이름Verifier = 새로운 HostnameVerifier() {
공개 부울 검증(문자열 arg0, SSLSession arg1) {
사실을 반환;
}
};
HttpsURLConnection.setDefaultHostnameVerifier(hostnameVerifier);
// URL url = 새 URL("https://172.40.1.83:8007");
URL url = 새 URL(urlString);
HttpsURLConnection urlCon = (HttpsURLConnection) URL
.openConnection();
urlCon.setDoOutput(true);
urlCon.setDoInput(true);
urlCon.setRequestMethod("POST");
urlCon.setRequestProperty("콘텐츠 유형",
"text/xml;charset=GB18030");
urlCon.setSSLSocketFactory(sslContext.getSocketFactory());
OutputStream os = urlCon.getOutputStream();
InputStream fis = 새로운 ByteArrayInputStream(requestData
.getBytes("GB18030"));
BufferedInputStream bis = new BufferedInputStream(fis);
바이트[] 바이트 = 새 바이트[1024];
int len = -1;
while ((len = bis.read(bytes)) != -1) {
os.write(바이트, 0, len);
}
os.flush();
bis.close();
fis.close();
os.close();
InputStream은 = urlCon.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is,
"GB18030"));
// DataInputStream indata = new DataInputStream(is);
// 문자열 ret = "";
// 문자열 str_return = "";
// 동안(ret != null) {
// ret = indata.readLine();
// if (ret != null && !ret.trim().equals("")) {
// str_return = str_return
// + new String(ret.getBytes("ISO-8859-1"), "GBK");
// }
// }
// System.out.println("str_return:" + str_return);
// System.out.println("br.readLine():"+new
// String(br.readLine().getBytes("GBK"), "GBK"));
sb = 새로운 StringBuffer();
스트링라인;
while ((line = br.readLine()) != null) {
sb.append(라인);
}
System.out.println("sb:" + sb);
br.닫기();
is.close();
urlCon.disconnect();
} 잡기(예외 e) {
e.fillInStackTrace();
log.info("클라이언트 호출 실패: " + e.getMessage());
throw new RuntimeException("https 호출이 실패했습니다!");
}
null을 반환;
}
공개 정적 무효 전송(문자열 requsetString, 문자열 requestData)
NoSuchAlgorithmException, KeyManagementException이 발생합니다.
ClientProtocolException, IOException {
// 먼저 상관하지 않는 신뢰 관리자를 만듭니다.
X509TrustManager trustManager = new X509TrustManager() {
공개 무효 checkClientTrusted(X509Certificate[] 체인,
문자열 authType)이 CertificateException을 발생시킵니다.
// 아무것도 하지 마세요.
}
공개 무효 checkServerTrusted(X509Certificate[] 체인,
문자열 authType)이 CertificateException을 발생시킵니다.
// 아무것도 하지 마세요.
}
공개 X509Certificate[] getAcceptedIssuers() {
// 아무것도 하지 마세요.
null을 반환;
}
};
// 이제 신뢰 관리자를 SSLContext에 넣습니다.
SSLContext sslcontext = SSLContext.getInstance("SSL");
sslcontext.init(null, new TrustManager[] { trustManager }, null);
// 위의 SSLContext를 사용하여 소켓 팩토리를 생성합니다.
// (공장 확장을 하려다 보니 좀 어렵더군요.
// 인수 없이 createSocket을 호출합니다.
// 내가 찾을 수 있는 모든 곳에 존재하지만, 헤이호).
SSLSocketFactory sf = new SSLSocketFactory(sslcontext);
sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
DefaultHttpClient httpclient = new DefaultHttpClient();
httpclient.getConnectionManager().getSchemeRegistry().register(
new Scheme("https", sf, 443));
// 문자열 요청 = "https://180.168.35.140/api/vm.list";
HttpPost httpPost = new HttpPost(requsetString);
문자열 결과 = "";
//HTTP 요청 실행
httpPost.setHeader("인증", "기본"
+ "dGNsb3VkYWRtaW46dGNsb3VkMTIz");
httpPost.setHeader("Content-type", "application/xml");
StringEntity reqEntity;
// 요청 매개변수를 HttpEntity로 캡슐화합니다.
reqEntity = new StringEntity(requestData);
BufferedHttpEntity bhe = new BufferedHttpEntity(reqEntity);
httpPost.setEntity(bhe);
HttpResponse 응답 = httpclient.execute(httpPost);
HttpEntity resEntity = response.getEntity();
InputStreamReader reader = new InputStreamReader(resEntity.getContent());
char[] 버프 = 새 문자[1024];
정수 길이 = 0;
while ((length = reader.read(buff)) != -1) {
결과 += new String(버프, 0, 길이);
}
httpclient.getConnectionManager().shutdown();
System.out.println(">>>:" + 결과);
}
공개 정적 무효 테스트() {
문자열 단어 = "안녕하세요";
노력하다 {
FileOutputStream out = new FileOutputStream("D:/file.txt");
out.write(words.getBytes());
out.flush();
종료.닫기();
} 잡기(예외 e) {
// TODO 자동 생성된 캐치 블록
e.printStackTrace();
}
}
}