ssl憑證 - Java:為什麼SSL握手給出'無法生成DH密鑰對'異常?




java憑證 client (17)

通過升級到JDK 8解決了該問題。

當我與某些IRC服務器建立SSL連接時(但不是其他服務器的首選加密方法),我得到以下異常:

Caused by: java.lang.RuntimeException: Could not generate DH keypair
    at com.sun.net.ssl.internal.ssl.DHCrypt.<init>(DHCrypt.java:106)
    at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverKeyExchange(ClientHandshaker.java:556)
    at com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:183)
    at com.sun.net.ssl.internal.ssl.Handshaker.processLoop(Handshaker.java:593)
    at com.sun.net.ssl.internal.ssl.Handshaker.process_record(Handshaker.java:529)
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:893)
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1138)
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1165)
    ... 3 more

最終原因:

Caused by: java.security.InvalidAlgorithmParameterException: Prime size must be multiple of 64, and can only range from 512 to 1024 (inclusive)
    at com.sun.crypto.provider.DHKeyPairGenerator.initialize(DashoA13*..)
    at java.security.KeyPairGenerator$Delegate.initialize(KeyPairGenerator.java:627)
    at com.sun.net.ssl.internal.ssl.DHCrypt.<init>(DHCrypt.java:100)
    ... 10 more

一個演示這個問題的服務器的例子是aperture.esper.net:6697(這是一個IRC服務器)。 kornbluth.freenode.net:6697沒有證明問題的服務器的一個例子。 [毫不奇怪,每個網絡上的所有服務器共享相同的行為。]

我的代碼(如前所述,在連接到某些SSL服務器時工作正常)是:

    SSLContext sslContext = SSLContext.getInstance("SSL");
    sslContext.init(null, trustAllCerts, new SecureRandom());
    s = (SSLSocket)sslContext.getSocketFactory().createSocket();
    s.connect(new InetSocketAddress(host, port), timeout);
    s.setSoTimeout(0);
    ((SSLSocket)s).startHandshake();

這是最後一個引發異常的開始。 是的,有一些魔術與'trustAllCerts'進行; 該代碼強制SSL系統不驗證證書。 (所以......不是證書問題。)

很明顯,有一種可能性是esper的服務器配置錯誤,但我搜索了但沒有找到任何其他人提及esper的SSL端口有問題的人,並且'​​openssl'連接了它(見下文)。 所以我想知道這是否是Java默認SSL支持的限制,或者其他什麼。 有什麼建議麼?

以下是使用命令行中的'openssl'連接到aperture.esper.net 6697時發生的情況:

~ $ openssl s_client -connect aperture.esper.net:6697
CONNECTED(00000003)
depth=0 /C=GB/ST=England/L=London/O=EsperNet/OU=aperture.esper.net/CN=*.esper.net/[email protected]
verify error:num=18:self signed certificate
verify return:1
depth=0 /C=GB/ST=England/L=London/O=EsperNet/OU=aperture.esper.net/CN=*.esper.net/[email protected]
verify return:1
---
Certificate chain
 0 s:/C=GB/ST=England/L=London/O=EsperNet/OU=aperture.esper.net/CN=*.esper.net/[email protected]
   i:/C=GB/ST=England/L=London/O=EsperNet/OU=aperture.esper.net/CN=*.esper.net/[email protected]
---
Server certificate
-----BEGIN CERTIFICATE-----
[There was a certificate here, but I deleted it to save space]
-----END CERTIFICATE-----
subject=/C=GB/ST=England/L=London/O=EsperNet/OU=aperture.esper.net/CN=*.esper.net/[email protected]
issuer=/C=GB/ST=England/L=London/O=EsperNet/OU=aperture.esper.net/CN=*.esper.net/[email protected]
---
No client certificate CA names sent
---
SSL handshake has read 2178 bytes and written 468 bytes
---
New, TLSv1/SSLv3, Cipher is DHE-RSA-AES256-SHA
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
SSL-Session:
    Protocol  : TLSv1
    Cipher    : DHE-RSA-AES256-SHA
    Session-ID: 51F1D40A1B044700365D3BD1C61ABC745FB0C347A334E1410946DCB5EFE37AFD
    Session-ID-ctx: 
    Master-Key: DF8194F6A60B073E049C87284856B5561476315145B55E35811028C4D97F77696F676DB019BB6E271E9965F289A99083
    Key-Arg   : None
    Start Time: 1311801833
    Timeout   : 300 (sec)
    Verify return code: 18 (self signed certificate)
---

如上所述,畢竟,它連接成功,這比我的Java應用程序所說的要多。

如果它是相關的,我使用OS X 10.6.8,Java版本1.6.0_26。


如果您使用的是jdk1.7.0_04,請升級到jdk1.7.0_21。 該更新已修復此問題。


對我來說,下面的命令行解決了這個問題:

java -jar -Dhttps.protocols=TLSv1.2 -Ddeployment.security.TLSv1.2=true -Djavax.net.debug=ssl:handshake XXXXX.jar

我正在使用JDK 1.7.0_79


嘗試從Java下載站點下載“Java加密擴展(JCE)無限強化管轄策略文件”並替換JRE中的文件。

這對我有用,我甚至不需要使用BouncyCastle - 標準的Sun JCE能夠連接到服務器。

PS。 我在更改策略文件之前嘗試使用BouncyCastle時遇到了​​同樣的錯誤(ArrayIndexOutOfBoundsException:64),所以看起來我們的情況非常相似。



我在Bamboo 5.7 + Gradle項目+ Apache中遇到了這個錯誤。 Gradle試圖通過SSL從我們的服務器獲得一些依賴關係。

解:

  1. 生成DH Param:

使用OpenSSL:

openssl dhparam 1024

示例輸出:

-----BEGIN DH PARAMETERS-----
MIGHfoGBALxpfMrDpImEuPlhopxYX4L2CFqQov+FomjKyHJrzj/EkTP0T3oAkjnS
oCGh6p07kwSLS8WCtYJn1GzItiZ05LoAzPs7T3ST2dWrEYFg/dldt+arifj6oWo+
vctDyDqIjlevUE+vyR9MF6B+Rfm4Zs8VGkxmsgXuz0gp/9lmftY7AgEC
-----END DH PARAMETERS-----
  1. 將輸出附加到證書文件(對於Apache- SSLCertificateFile參數)

  2. 重新啟動apache

  3. 重新啟動Bamboo

  4. 嘗試再次構建項目


我在JDK 1.6.45上使用了coldfusion 8,並且遇到了給我使用紅色十字而不是圖像的問題,而且cfhttp也無法使用ssl連接到本地web服務器。

我的測試腳本使用Coldfusion 8重現

<CFHTTP URL="https://www.onlineumfragen.com" METHOD="get" ></CFHTTP>
<CFDUMP VAR="#CFHTTP#">

這給了我一個非常普遍的錯誤:“I / O異常:對方未經過身份驗證”。 然後我嘗試添加服務器的證書,包括根證書和中間證書到java密鑰庫和coldfusion密鑰庫,但沒有任何幫助。 然後我調試了這個問題

java SSLPoke www.onlineumfragen.com 443

得到了

javax.net.ssl.SSLException: java.lang.RuntimeException: Could not generate DH keypair

Caused by: java.security.InvalidAlgorithmParameterException: Prime size must be
multiple of 64, and can only range from 512 to 1024 (inclusive)
    at com.sun.crypto.provider.DHKeyPairGenerator.initialize(DashoA13*..)
    at java.security.KeyPairGenerator$Delegate.initialize(KeyPairGenerator.java:627)
    at com.sun.net.ssl.internal.ssl.DHCrypt.<init>(DHCrypt.java:107)
    ... 10 more

然後我的想法是webserver(我的例子中的apache)對於ssl具有非常現代的密碼,並且是非常有限制的(qualys得分+),並且使用超過1024比特的強大diffie hellmann密鑰。 顯然,Coldfusion和java jdk 1.6.45無法管理這個。 odysee的下一步是考慮為java安裝一個替代安全提供程序,並決定使用彈性城堡。 另見http://www.itcsolutions.eu/2011/08/22/how-to-use-bouncy-castle-cryptographic-api-in-netbeans-or-eclipse-for-java-jse-projects/

然後我下載了

bcprov-ext-jdk15on-156.jar

http://www.bouncycastle.org/latest_releases.html並安裝在C:\ jdk6_45 \ jre \ lib \ ext下,或者你的jdk所在的位置,在coldfusion 8的原始安裝中,它將位於C:\ JRun4 \ jre \ lib \ ext,但我使用位於coldfusion目錄之外的更新的jdk(1.6.45)。 將bcprov-ext-jdk15on-156.jar放在\ ext目錄中是非常重要的(這花費了我大約兩個小時的時間和一些頭髮;-)然後我編輯了文件C:\ jdk6_45 \ jre \ lib \ security \ java.security(使用wordpad而不是editor.exe!)並將新行提供給一行。 事後名單看起來像

#
# List of providers and their preference orders (see above):
#
security.provider.1=org.bouncycastle.jce.provider.BouncyCastleProvider
security.provider.2=sun.security.provider.Sun
security.provider.3=sun.security.rsa.SunRsaSign
security.provider.4=com.sun.net.ssl.internal.ssl.Provider
security.provider.5=com.sun.crypto.provider.SunJCE
security.provider.6=sun.security.jgss.SunProvider
security.provider.7=com.sun.security.sasl.Provider
security.provider.8=org.jcp.xml.dsig.internal.dom.XMLDSigRI
security.provider.9=sun.security.smartcardio.SunPCSC
security.provider.10=sun.security.mscapi.SunMSCAPI

(請參閱位置1中的新建)

然後徹底重啟coldfusion服務。 那麼你可以

java SSLPoke www.onlineumfragen.com 443 (or of course your url!)

並享受這種感覺...當然

多麼美好的夜晚和一天。 希望這將有助於(部分或全部)給那裡的人。 如果您有任何疑問,請將信息發送給我......(上面的域名)。


這裡是我的解決方案(Java 1.6),也會感興趣為什麼我必須這樣做:

我從javax.security.debug = ssl注意到,有時使用的密碼套件是TLS_DHE _...,有時它是TLS_ECDHE _....如果我添加了BouncyCastle,後面會發生。 如果選擇了TLS_ECDHE_,那麼它的工作時間最長,但並非總是如此,所以即使添加了BouncyCastle提供程序也是不可靠的(每隔一段時間左右都會出現相同的錯誤)。 我猜在Sun的SSL實現中有時會選擇DHE ,有時候會選擇ECDHE

所以這裡發布的解決方案依賴於完全刪除TLS_DHE_密碼。 注:該解決方案不需要BouncyCastle。

所以通過以下方式創建服務器認證文

echo |openssl s_client -connect example.org:443 2>&1 |sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p'

保存它,因為它將在稍後引用,這裡是SSL http get的解決方案,不包括TLS_DHE_密碼套件。

package org.example.security;

import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.InetAddress;
import java.net.Socket;
import java.net.URL;
import java.net.UnknownHostException;
import java.security.KeyStore;
import java.security.cert.Certificate;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;
import java.util.ArrayList;
import java.util.List;

import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLParameters;
import javax.net.ssl.SSLSocket;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManagerFactory;

import org.apache.log4j.Logger;

public class SSLExcludeCipherConnectionHelper {

    private Logger logger = Logger.getLogger(SSLExcludeCipherConnectionHelper.class);

    private String[] exludedCipherSuites = {"_DHE_","_DH_"};

    private String trustCert = null;

    private TrustManagerFactory tmf;

    public void setExludedCipherSuites(String[] exludedCipherSuites) {
        this.exludedCipherSuites = exludedCipherSuites;
    }

    public SSLExcludeCipherConnectionHelper(String trustCert) {
        super();
        this.trustCert = trustCert;
        //Security.addProvider(new BouncyCastleProvider());
        try {
            this.initTrustManager();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    private void initTrustManager() throws Exception {
        CertificateFactory cf = CertificateFactory.getInstance("X.509");
        InputStream caInput = new BufferedInputStream(new FileInputStream(trustCert));
        Certificate ca = null;
        try {
            ca = cf.generateCertificate(caInput);
            logger.debug("ca=" + ((X509Certificate) ca).getSubjectDN());
        } finally {
            caInput.close();
        }

        // Create a KeyStore containing our trusted CAs
        KeyStore keyStore = KeyStore.getInstance("jks");
        keyStore.load(null, null);
        keyStore.setCertificateEntry("ca", ca);

        // Create a TrustManager that trusts the CAs in our KeyStore
        String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm();
        tmf = TrustManagerFactory.getInstance(tmfAlgorithm);
        tmf.init(keyStore);
    }

    public String get(URL url) throws Exception {
        // Create an SSLContext that uses our TrustManager
        SSLContext context = SSLContext.getInstance("TLS");
        context.init(null, tmf.getTrustManagers(), null);
        SSLParameters params = context.getSupportedSSLParameters();
        List<String> enabledCiphers = new ArrayList<String>();
        for (String cipher : params.getCipherSuites()) {
            boolean exclude = false;
            if (exludedCipherSuites != null) {
                for (int i=0; i<exludedCipherSuites.length && !exclude; i++) {
                    exclude = cipher.indexOf(exludedCipherSuites[i]) >= 0;
                }
            }
            if (!exclude) {
                enabledCiphers.add(cipher);
            }
        }
        String[] cArray = new String[enabledCiphers.size()];
        enabledCiphers.toArray(cArray);

        // Tell the URLConnection to use a SocketFactory from our SSLContext
        HttpsURLConnection urlConnection =
            (HttpsURLConnection)url.openConnection();
        SSLSocketFactory sf = context.getSocketFactory();
        sf = new DOSSLSocketFactory(sf, cArray);
        urlConnection.setSSLSocketFactory(sf);
        BufferedReader in = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()));
        String inputLine;
        StringBuffer buffer = new StringBuffer();
        while ((inputLine = in.readLine()) != null) 
            buffer.append(inputLine);
        in.close();

        return buffer.toString();
    }

    private class DOSSLSocketFactory extends javax.net.ssl.SSLSocketFactory {

        private SSLSocketFactory sf = null;
        private String[] enabledCiphers = null;

        private DOSSLSocketFactory(SSLSocketFactory sf, String[] enabledCiphers) {
            super();
            this.sf = sf;
            this.enabledCiphers = enabledCiphers;
        }

        private Socket getSocketWithEnabledCiphers(Socket socket) {
            if (enabledCiphers != null && socket != null && socket instanceof SSLSocket)
                ((SSLSocket)socket).setEnabledCipherSuites(enabledCiphers);

            return socket;
        }

        @Override
        public Socket createSocket(Socket s, String host, int port,
                boolean autoClose) throws IOException {
            return getSocketWithEnabledCiphers(sf.createSocket(s, host, port, autoClose));
        }

        @Override
        public String[] getDefaultCipherSuites() {
            return sf.getDefaultCipherSuites();
        }

        @Override
        public String[] getSupportedCipherSuites() {
            if (enabledCiphers == null)
                return sf.getSupportedCipherSuites();
            else
                return enabledCiphers;
        }

        @Override
        public Socket createSocket(String host, int port) throws IOException,
                UnknownHostException {
            return getSocketWithEnabledCiphers(sf.createSocket(host, port));
        }

        @Override
        public Socket createSocket(InetAddress address, int port)
                throws IOException {
            return getSocketWithEnabledCiphers(sf.createSocket(address, port));
        }

        @Override
        public Socket createSocket(String host, int port, InetAddress localAddress,
                int localPort) throws IOException, UnknownHostException {
            return getSocketWithEnabledCiphers(sf.createSocket(host, port, localAddress, localPort));
        }

        @Override
        public Socket createSocket(InetAddress address, int port,
                InetAddress localaddress, int localport) throws IOException {
            return getSocketWithEnabledCiphers(sf.createSocket(address, port, localaddress, localport));
        }

    }
}

最後,這裡是如何使用它(certFilePath,如果從openssl保存的證書的路徑):

try {
            URL url = new URL("https://www.example.org?q=somedata");            
            SSLExcludeCipherConnectionHelper sslExclHelper = new SSLExcludeCipherConnectionHelper(certFilePath);
            logger.debug(
                    sslExclHelper.get(url)
            );
        } catch (Exception ex) {
            ex.printStackTrace();
        }

您可以動態安裝提供程序:

1)下載這些罐子:

  • bcprov-jdk15on-152.jar
  • bcprov-ext-jdk15on-152.jar

2)將jar複製到WEB-INF/lib (或你的類路徑)

3)動態添加提供者:

import org.bouncycastle.jce.provider.BouncyCastleProvider;

...

Security.addProvider(new BouncyCastleProvider());


我曾使用IBM JDK通過Java SVN客戶端訪問svn.apache.org時發生類似的錯誤。 目前,svn.apache.org使用客戶端密碼首選項。

使用數據包捕獲/ javax.net.debug = ALL運行一次之後,我只能將一個DHE密碼列入黑名單,而且這些數據適用於我(ECDHE正在協商)。

.../java/jre/lib/security/java.security:
    jdk.tls.disabledAlgorithms=SSL_DHE_RSA_WITH_AES_256_CBC_SHA

一個很好的快速修復,當它不容易更改客戶端。


“Java密碼學擴展(JCE)無限強度管轄權策略文件”答案不適用於我,但BouncyCastle的JCE提供者建議做到了。

以下是我在Mac OSC 10.7.5上使用Java 1.6.0_65-b14-462的步驟

1)下載這些罐子:

2)將這些罐子移動到$ JAVA_HOME / lib / ext

3)編輯$ JAVA_HOME / lib / security / java.security,如下所示:security.provider.1 = org.bouncycastle.jce.provider.BouncyCastleProvider

使用JRE重新啟動應用並嘗試一下


問題是素數大小。 Java接受的最大可接受的大小是1024位。 這是一個已知問題(參見JDK-6521495 )。

我鏈接到的錯誤報告提到了使用BouncyCastle的JCE實現的workaround 。 希望這應該為你工作。

UPDATE

這被報告為bug JDK-7044060並且最近被修復。

但請注意,限制僅提升到2048位。 對於大於2048位的大小,有JDK-8072452 - 刪除DH密鑰的最大素數大小 ; 該修復似乎是9。


有可能你有不正確的Maven依賴關係。 您必須在Maven依賴關係層次結構中找到這些庫:

bcprov-jdk14, bcpkix-jdk14, bcmail-jdk14

如果你有這些依賴是錯誤,你應該這樣做:

添加依賴項:

<dependency>
    <groupId>org.bouncycastle</groupId>
    <artifactId>bcmail-jdk15on</artifactId>
    <version>1.59</version>
</dependency>

從包含錯誤依賴關係的工件中排除這些依賴關係,在我的情況下為:

<dependency>
    <groupId>com.lowagie</groupId>
    <artifactId>itext</artifactId>
    <version>2.1.7</version>
    <exclusions>
        <exclusion>
            <groupId>org.bouncycastle</groupId>
            <artifactId>bctsp-jdk14</artifactId>                
        </exclusion>
        <exclusion>
            <groupId>bouncycastle</groupId>
            <artifactId>bcprov-jdk14</artifactId>               
        </exclusion>
        <exclusion>
            <groupId>bouncycastle</groupId>
            <artifactId>bcmail-jdk14</artifactId>               
        </exclusion>
    </exclusions>       
</dependency>

如果服務器支持不包含DH的密碼,則可以強制客戶端選擇該密碼並避免DH錯誤。 如:

String pickedCipher[] ={"TLS_RSA_WITH_AES_256_CBC_SHA"};
sslsocket.setEnabledCipherSuites(pickedCipher);

請記住,從長遠來看,指定一個確切的密碼很容易破損。


我與Yandex Maps服務器,JDK 1.6和Apache HttpClient 4.2.1有同樣的問題。 錯誤是

javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated

通過-Djavax.net.debug=all啟用調試日誌中有一條消息

Could not generate DH keypair

我已經通過添加BouncyCastle庫bcprov-jdk16-1.46.jar並在地圖服務類中註冊提供程序來解決了此問題

public class MapService {

    static {
        Security.addProvider(new BouncyCastleProvider());
    }

    public GeocodeResult geocode() {

    }

}

提供者在MapService的第一次使用時被註冊。


如果你仍然被這個問題困擾,而且你正在使用Apache httpd v 2.4.7,請試試這個: http://httpd.apache.org/docs/current/ssl/ssl_faq.html#javadh : http://httpd.apache.org/docs/current/ssl/ssl_faq.html#javadh

從網址複製

從版本2.4.7開始,mod_ssl將使用包含長度超過1024位的素數的DH參數。 然而,Java 7和更早版本將它們對DH素數大小的支持限制為最多1024位。

如果您的基於Java的客戶機異常終止,例如java.lang.RuntimeException:無法生成DH keypair和java.security.InvalidAlgorithmParameterException:素數大小必須是64的倍數,並且只能在512到1024之間(包括),並且您可以使用SSLCipherSuite(可能與SSLHonorCipherOrder一起使用)重新排列mod_ssl的密碼列表,或者您可以使用具有1024位素數的自定義DH參數(httpd記錄tlsv1警報內部錯誤(SSL警報編號80)(在LogLevel信息或更高級別) ,它總是優先於任何內置的DH參數。

要生成自定義DH參數,請使用

openssl dhparam 1024

命令。 或者,您可以使用RFC 2409第6.2節中的以下標準1024位DH參數:

-----BEGIN DH PARAMETERS-----
MIGHAoGBAP//////////yQ/aoiFowjTExmKLgNwc0SkCTgiKZ8x0Agu+pjsTmyJR
Sgh5jjQE3e+VGbPNOkMbMCsKbfJfFDdP4TVtbVHCReSFtXZiXn7G9ExC6aY37WsL
/1y29Aa37e44a/taiZ+lrp8kEXxLH+ZJKGZR7OZTgf//////////AgEC
-----END DH PARAMETERS-----

將包含“BEGIN DH參數”和“END DH PARAMETERS”行的自定義參數添加到您使用SSLCertificateFile指令配置的第一個證書文件的末尾。

我在客戶端使用Java 1.6,並解決了我的問題。 我沒有降低密碼套件或類似,但添加了一個自定義生成的DH參數到證書文件..


  1. 包com.test;

    import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStream; import java.net.HttpURLConnection; import java.net.URL;

    公共類Firebase {

    public static void main(String[] args) throws IOException {         final
    

    String apiKey =“AAAAqf1B9uQ:********** _ 1MoeQBVPbVROXuyD4ERyV-i6nva0LAic9uRotN80C9utoaGL9Sp1GjrPr5-mtJBlxVNbuqG1zeg9LBnslZw-vyud3jW-11SWDfLBB26bcHuAi8bdnQCPcj3DWKX2h”; 網址url =新網址(“ https://fcm.googleapis.com/fcm/send ”); HttpURLConnection conn =(HttpURLConnection)url.openConnection(); System.setProperty(“javax.net.debug”,“全”); conn.setDoOutput(真); conn.setRequestMethod(“POST”); conn.setRequestProperty(“Content-Type”,“application / json”); conn.setRequestProperty(“授權”,“key =”+ apiKey);

        conn.setDoOutput(true);
    
        String input = "{\r\n\"to\":
    

    \“fdaxKOmRcAI:APA91bEXILacYEjypsbusKXHV_TuEzt_vsqhI5OxH - ****************** - l2qGIORSiE0W5B2d74yjXAz60l \”,\ r \ n \“通知\”:{\ r \ n \“title \”: \“title \”,\ r \ n \“body \”:\“一個vijay的主體\”\ r \ n} \ r \ n}“;

                OutputStream os = conn.getOutputStream();       os.write(input.getBytes());         os.flush();         os.close();
    
        int responseCode = conn.getResponseCode();
        System.out.println("\nSending 'POST' request to URL : " + url);
        System.out.println("Post parameters : " + input);
        System.out.println("Response Code : " + responseCode);
    
        BufferedReader in = new BufferedReader(new
    

    InputStreamReader的(conn.getInputStream())); String inputLine; StringBuffer response = new StringBuffer();

        while ((inputLine = in.readLine()) != null) {
            response.append(inputLine);         }       in.close();
    
        // print result         System.out.println(response.toString());
    
    }
    

    }

    1. 項目清單




java ssl