我试图从特定的网址下载验证码图片,因为我正在开发一个解决简单验证码的程序。 我正在使用的网址:https://www.mannschaftsfoto-nrw.de/rpc/captcha/Ddc3Lp5eOshwmzWfpgL4cNCTnZTcOU2T 我以前读过很多帖子并尝试了不同的东西,我现在使用的是这段代码:
URL url = new URL("https://www.mannschaftsfoto-nrw.de/rpc/captcha/Ddc3Lp5eOshwmzWfpgL4cNCTnZTcOU2T");
InputStream in = new BufferedInputStream(url.openStream());
ByteArrayOutputStream out = new ByteArrayOutputStream();
byte[] buf = new byte[1024];
int n = 0;
while (-1!=(n=in.read(buf)))
{
out.write(buf, 0, n);
}
out.close();
in.close();
byte[] response = out.toByteArray();
FileOutputStream fos = new FileOutputStream("C://captcha.jpg");
fos.write(response);
fos.close();
事实上,当我使用不同的网址(例如Google图片)时,这确实有用,但它对我的链接不起作用。我得到了例外:
Exception: javax.net.ssl.SSLException: java.lang.RuntimeException: Could not generate DH keypair
这个功能是否可以正常工作,虽然链接不会以" .png"
答案 0 :(得分:1)
我尝试执行上面的相同程序。它很酷,图像下载到C:\ captcha.jpg。这是下面的代码。
因此,无需在链接末尾添加.jpg即可下载图像。我用了jdk1.6.0_45。
对于SSL问题,解决方法如下,
从版本2.4.7开始,mod_ssl将使用DH参数,其中包括长度超过1024位的素数。但是,Java 7及更早版本将它们对DH prime大小的支持限制为最多1024位。
如果基于Java的客户端因例外java.lang.RuntimeException而中止:无法生成DH密钥对和java.security.InvalidAlgorithmParameterException:Prime大小必须是64的倍数,并且只能在512到1024之间(包括)和httpd日志tlsv1警告内部错误(SSL警报号80)(在LogLevel信息或更高版本),您可以使用SSLCipherSuite重新排列mod_ssl的密码列表(可能与SSLHonorCipherOrder一起使用),或者您可以使用自定义DH具有1024位素数的参数,它始终优先于任何内置DH参数。
要生成自定义DH参数,请使用openssl dhparam 1024命令。
因此,您的代码应该与没有ssl问题的java 8完美配合。
package stack.overflow;
import java.io.BufferedInputStream;
import java.io.ByteArrayOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
public class Testing {
public static void main(String[] args) {
URL url = null;
try {
url = new URL("https://www.mannschaftsfoto-nrw.de/rpc/captcha/Ddc3Lp5eOshwmzWfpgL4cNCTnZTcOU2T");
InputStream in = new BufferedInputStream(url.openStream());
ByteArrayOutputStream out = new ByteArrayOutputStream();
byte[] buf = new byte[1024];
int n = 0;
while (-1!=(n=in.read(buf)))
{
out.write(buf, 0, n);
}
out.close();
in.close();
byte[] response = out.toByteArray();
FileOutputStream fos = new FileOutputStream("C://captcha.jpg");
fos.write(response);
fos.close();
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
答案 1 :(得分:0)
您需要使用open ssl
从服务器下载所有证书/证书链假设您已安装OpenSSL(默认在Mac OS X和Linux系统上可用),请查看s_client命令:
openssl s_client -host google.com -port 443 -prexit -showcerts
以上命令将google.com的完整证书链打印到stdout。现在,您只需将每个证书复制到单独的PEM文件(例如googleca.pem)。最后,您可以导入(Java)信任库中的每个证书。要导入一个证书:
keytool -import -alias gca -file googleca.pem -keystore trust.jks
现在使用此信任库以安全HTTP模式与网站建立连接。