最近做应用分享微博到新浪和腾讯的后台服务支撑的时候,发现一个问题,应用打成jar包的时候,部署到linux环境下,在请求腾讯https://open.t.qq.com/cgi-bin/request_token校验的时候后台服务抛出了SSLException:
java.lang.Exception: javax.net.ssl.SSLException: Server key
at com.tencent.weibo.utils.QHttpClient.httpGet(QHttpClient.java:65)
at com.tencent.weibo.utils.OAuthClient.requestToken(OAuthClient.java:50)
at com.test.QQTest.requestToken(QQTest.java:37)
at com.test.QQTest.main(QQTest.java:26)
Caused by: javax.net.ssl.SSLException: Server key
at com.sun.net.ssl.internal.ssl.Handshaker.throwSSLException(Handshaker.java:850)
at com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:150)
at com.sun.net.ssl.internal.ssl.Handshaker.processLoop(Handshaker.java:516)
at com.sun.net.ssl.internal.ssl.Handshaker.process_record(Handshaker.java:454)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:884)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1096)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.writeRecord(SSLSocketImpl.java:623)
at com.sun.net.ssl.internal.ssl.AppOutputStream.write(AppOutputStream.java:59)
at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:65)
at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:123)
at org.apache.commons.httpclient.HttpConnection.flushRequestOutputStream(HttpConnection.java:828)
at org.apache.commons.httpclient.HttpMethodBase.writeRequest(HttpMethodBase.java:2116)
at org.apache.commons.httpclient.HttpMethodBase.execute(HttpMethodBase.java:1096)
at org.apache.commons.httpclient.HttpMethodDirector.executeWithRetry(HttpMethodDirector.java:398)
at org.apache.commons.httpclient.HttpMethodDirector.executeMethod(HttpMethodDirector.java:171)
at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:397)
at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:323)
at com.tencent.weibo.utils.QHttpClient.httpGet(QHttpClient.java:53)
... 3 more
Caused by: java.security.InvalidKeyException: No installed provider supports this key: sun.security.rsa.RSAPublicKeyImpl
at java.security.Signature$Delegate.chooseProvider(Signature.java:1056)
at java.security.Signature$Delegate.engineInitVerify(Signature.java:1088)
at java.security.Signature.initVerify(Signature.java:420)
at com.sun.net.ssl.internal.ssl.HandshakeMessage$DH_ServerKeyExchange.<init>(HandshakeMessage.java:773)
at com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:145)
... 19 more
Caused by: java.security.NoSuchAlgorithmException: NONEwithRSA Signature not available
at java.security.Signature.getInstance(Signature.java:193)
at com.sun.net.ssl.internal.ssl.JsseJce.getSignature(JsseJce.java:197)
at com.sun.net.ssl.internal.ssl.RSASignature.<init>(RSASignature.java:45)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
at java.lang.Class.newInstance0(Class.java:355)
at java.lang.Class.newInstance(Class.java:308)
at java.security.Provider$Service.newInstance(Provider.java:1221)
at java.security.Signature$Delegate.newInstance(Signature.java:938)
at java.security.Signature$Delegate.chooseProvider(Signature.java:1032)
... 23 more
但是将其打成war包部署到tomcat中时,向腾讯发起请求的话就会正常交互;(明明一个纯后台的东西,还得跑到tomcat下,很不爽...)
百度找到一个解决办法,将https://open.t.qq.com/cgi-bin/request_token该成http://open.t.qq.com/cgi-bin/request_token,不过这样就要修改腾讯SDK的源码了;
接着调试新浪的API接口,结果直接抛空指针异常:
Exception in thread "main" java.lang.NullPointerException
at weibo4android.http.BASE64Encoder.encode(BASE64Encoder.java:46)
at weibo4android.http.OAuth.generateSignature(OAuth.java:161)
at weibo4android.http.OAuth.generateAuthorizationHeader(OAuth.java:85)
at weibo4android.http.OAuth.generateAuthorizationHeader(OAuth.java:125)
at weibo4android.http.HttpClient.setHeaders(HttpClient.java:715)
at weibo4android.http.HttpClient.httpRequest(HttpClient.java:607)
at weibo4android.http.HttpClient.httpRequest(HttpClient.java:591)
at weibo4android.http.HttpClient.getOauthRequestToken(HttpClient.java:166)
at weibo4android.Weibo.getOAuthRequestToken(Weibo.java:1567)
at com.test.SinaTest.requestToken(SinaTest.java:57)
at com.test.SinaTest.main(SinaTest.java:34)
查看其SDK源码,发现at weibo4android.http.OAuth.generateSignature(OAuth.java:161)时
执行Mac mac = Mac.getInstance(HMAC_SHA1);的时候直接抛出异常了,其竟然没做任何处理...
} catch (NoSuchAlgorithmException ignore) {
// should never happen
}
将异常打印出来发现:
java.security.NoSuchAlgorithmException: Algorithm HmacSHA1 not available
at javax.crypto.Mac.getInstance(DashoA13*..)
at weibo4android.http.OAuth.generateSignature(OAuth.java:139)
at weibo4android.http.OAuth.generateAuthorizationHeader(OAuth.java:85)
at weibo4android.http.OAuth.generateAuthorizationHeader(OAuth.java:125)
at weibo4android.http.HttpClient.setHeaders(HttpClient.java:715)
at weibo4android.http.HttpClient.httpRequest(HttpClient.java:607)
at weibo4android.http.HttpClient.httpRequest(HttpClient.java:591)
at weibo4android.http.HttpClient.getOauthRequestToken(HttpClient.java:166)
at weibo4android.Weibo.getOAuthRequestToken(Weibo.java:1567)
at com.test.SinaTest.requestToken(SinaTest.java:57)
at com.test.SinaTest.main(SinaTest.java:34)
继续百度,找到一个参考资料http://stackoverflow.com/questions/2856248/nosuchalgorithmexception-algorithm-hmacsha1-not-available
照着做,在sinaSDK源码Mac mac = Mac.getInstance(HMAC_SHA1);前加入
java.security.Security.addProvider(new com.sun.crypto.provider.SunJCE());
然后将sunjce_provider.jar 考到lib下,sunjce_provider.jar 原来位于 $JAVA_HOME/jre/lib/ext
下;
然后执行,ok,没问题了~~
思考~~~why??继续咬牙看上面的参考资料http://stackoverflow.com/questions/2856248/nosuchalgorithmexception-algorithm-hmacsha1-not-available里面的回答;
回答的哥们说可能是$JAVA_HOME/jre/lib、security/java.security 中不包含SunJCE的设置,所以需要在代码中添加
java.security.Security.addProvider(new com.sun.crypto.provider.SunJCE());
然后又找到一个资料http://chenjianjx.iteye.com/blog/738285;
可是我的java.security 中明明包含了security.provider.4=com.sun.crypto.provider.SunJCE
难道是因为找不到sunjce_provider.jar,即时配置了也不管用的原因?
于是乎,全部代码还原,全部SDK代码还原,只是在lib中添加了sunjce_provider.jar,发现所有问题都解决了~~
腾讯API的SSLException也没问题了~~
ok,说了这么多,就是因为缺少sunjce_provider.jar的原因,不知道为什么在tomcat中跑时没问题,难道是tomcat启动的时候加载了~~
继续找资料,$JAVA_HOME/jre/lib/ext 中的jar包会在jvm启动的时候自动加载,可是为什么sunjce_provider.jar没有加载?难道是什么时候跳过了$JAVA_HOME/jre/lib/ext 的加载?
看了一下,启动的命令...jre/bin/java -Xms256m -Xmx512m -Dlabel=temp -Djava.ext.dirs=../lib/ com.test.SinaTest &
ok,现在清楚了,在启动的时候将ext.dirs设成了=../lib/,这个时候自然不会继续加载了~~
(为什么要这样写呢,因为之前某个哥们在lib下放了需要手动改的配置文件~~)
分享到:
相关推荐
微博作为中国主要的社交媒体平台之一,其开放API接口允许开发者通过OAuth验证机制来获取用户的授权,以便在第三方应用中实现微博的功能,如发布微博、读取用户信息等。OAuth验证是一种广泛使用的授权协议,它使得...
在本文中,我们将深入探讨如何使用Apache JMeter进行OAuth 1.0授权认证。...JMeter是一款强大的性能...这虽然比直接使用支持OAuth的工具更复杂,但对于自定义测试场景或在没有其他选项的情况下,这是一个可行的解决方案。
本文将深入探讨两种使用SpringMVC实现微信企业号OAuth2验证接口的方法。 一、注解方式实现OAuth2验证 1. 配置OAuth2客户端:首先,你需要在SpringMVC的配置文件中添加OAuth2客户端的相关配置,包括appid、app...
运行defender-oauth2-authorization模块下AuthorizationApplication类的main方法。 ###启动资源服务器 运行defender-oauth2-resource模块下ResourceApplication类的main方法。 ###启动客户端服务器 运行...
c# WebApi Owin 适用Microsoft.Owin.Security.OAuth Authorize - 特性验证
SpringBoot整合OAuth2和Gateway实现网关登录授权验证是一个复杂而关键的过程,它涉及到现代微服务架构中的安全性设计。OAuth2是一种授权框架,用于保护API并允许第三方应用访问受保护的资源,而Spring Gateway作为...
Spring Cloud OAuth2是一种基于OAuth2协议的授权框架,它为微服务架构提供了安全的认证和授权服务。在“Spring Cloud Oauth2的密码模式数据库方式实现登录授权验证”这个主题中,我们将深入探讨如何利用OAuth2的密码...
这个“OAuth测试工具”正是为了帮助开发者解决OAuth签名问题而设计的。签名是OAuth协议中的关键环节,用于确保请求的完整性和安全性。签名错误可能导致授权失败,甚至可能被恶意第三方利用。该工具通过模拟完整的...
"WebApi使用TOKEN+签名验证"是一种常见的安全策略,它结合了令牌(Token)验证和签名机制,以确保只有授权的客户端能够访问服务。下面将详细介绍这两种方法及其在实际应用中的实现。 1. **令牌(Token)验证**: ...
本项目“springboot-security-oauth2”旨在实现基于Spring Boot的权限验证机制,利用Security的认证和授权功能,以及OAuth2的授权框架,为应用程序提供安全的访问控制。 首先,Spring Boot是Spring框架的简化版,它...
同时,了解这些源码也有助于调试和解决Spring Security OAuth在实际项目中遇到的问题。 总之,Spring Security OAuth源码提供了一个深入了解OAuth 2.0协议及其在Spring生态系统中实现的绝佳机会。通过研究Sparklr2...
OAuth2.0是一种授权框架,广泛应用于Web API的身份验证和授权。它允许第三方应用在用户授权的情况下,访问该用户的特定资源,而无需获取用户的用户名和密码。OAuth2.0的核心是将认证和授权分离,提高了安全性,同时...
- **安全**: 提供了强大的签名算法和加密方法,确保数据传输的安全。 - **文档齐全**: 官方文档详细且易懂,帮助开发者快速上手。 在使用`Authlib`时,开发者需要理解OAuth的工作流程,包括授权码流、隐式流、...
OAuth 2.0 是一个授权框架,用于安全地允许第三方应用访问用户存储在另一服务上的资源,而无需共享用户凭证。在这个Java实现中,我们利用了MAVEN作为项目管理工具和OLTU库来构建OAuth 2.0服务端和客户端。同时,数据...
- 调用签名函数:根据请求类型和参数,调用对应的签名方法,如`oauth.hmac_sha1()`或`oauth.rsa_sha1()`。 - 添加签名到请求头:将生成的签名添加到OAuth相关的请求头字段中,如`Authorization`。 总之,`oauth-...
Spring Cloud Oauth2和JWT(JSON Web Token)的结合提供了高效且灵活的解决方案。本文将深入探讨如何使用Spring Cloud Oauth2的密码模式和JWT来实现登录验证授权。 首先,OAuth2是一个开放标准,用于授权第三方应用...
OAuth 2.0 是一个授权框架,它允许第三方应用在用户许可的情况下访问其私有资源。OAuth 2.0 主要用于 API 的身份验证和授权,如 Google、Facebook 和 GitHub 等大型服务提供商广泛使用它来管理用户授权。 在 OAuth ...
例如,对于OAuth 1.0a,可以使用`oauth_request()`函数生成签名后的请求,而对于OAuth 2.0,可能需要调用`fetch_token()`来获取访问令牌。 `oauthlib-oauthlib-31cae75`这个文件名可能指的是OAuthLib库的某个特定...