`
lvmlvy_1983
  • 浏览: 30506 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

linux下运行main函数OAuth验证遇到的签名问题的解决办法

    博客分类:
  • java
 
阅读更多

最近做应用分享微博到新浪和腾讯的后台服务支撑的时候,发现一个问题,应用打成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下放了需要手动改的配置文件~~)

 

 

分享到:
评论

相关推荐

    新浪微博OAuth 验证

    微博作为中国主要的社交媒体平台之一,其开放API接口允许开发者通过OAuth验证机制来获取用户的授权,以便在第三方应用中实现微博的功能,如发布微博、读取用户信息等。OAuth验证是一种广泛使用的授权协议,它使得...

    jmeter 实现oauth1.0授权认证

    在本文中,我们将深入探讨如何使用Apache JMeter进行OAuth 1.0授权认证。...JMeter是一款强大的性能...这虽然比直接使用支持OAuth的工具更复杂,但对于自定义测试场景或在没有其他选项的情况下,这是一个可行的解决方案。

    微信企业号OAuth2验证接口的2种实例(使用SpringMVC)

    本文将深入探讨两种使用SpringMVC实现微信企业号OAuth2验证接口的方法。 一、注解方式实现OAuth2验证 1. 配置OAuth2客户端:首先,你需要在SpringMVC的配置文件中添加OAuth2客户端的相关配置,包括appid、app...

    Spring Security oauth2

    运行defender-oauth2-authorization模块下AuthorizationApplication类的main方法。 ###启动资源服务器 运行defender-oauth2-resource模块下ResourceApplication类的main方法。 ###启动客户端服务器 运行...

    c# Microsoft.Owin.Security.OAuth 验证获取Token用户的信息.txt

    c# WebApi Owin 适用Microsoft.Owin.Security.OAuth Authorize - 特性验证

    springboot整合Oauth2,GateWay实现网关登录授权验证

    SpringBoot整合OAuth2和Gateway实现网关登录授权验证是一个复杂而关键的过程,它涉及到现代微服务架构中的安全性设计。OAuth2是一种授权框架,用于保护API并允许第三方应用访问受保护的资源,而Spring Gateway作为...

    Spring cloud Oauth2的密码模式数据库方式实现登录授权验证

    Spring Cloud OAuth2是一种基于OAuth2协议的授权框架,它为微服务架构提供了安全的认证和授权服务。在“Spring Cloud Oauth2的密码模式数据库方式实现登录授权验证”这个主题中,我们将深入探讨如何利用OAuth2的密码...

    Oauth测试工具

    这个“OAuth测试工具”正是为了帮助开发者解决OAuth签名问题而设计的。签名是OAuth协议中的关键环节,用于确保请求的完整性和安全性。签名错误可能导致授权失败,甚至可能被恶意第三方利用。该工具通过模拟完整的...

    WebApi 使用TOKEN+签名验证

    "WebApi使用TOKEN+签名验证"是一种常见的安全策略,它结合了令牌(Token)验证和签名机制,以确保只有授权的客户端能够访问服务。下面将详细介绍这两种方法及其在实际应用中的实现。 1. **令牌(Token)验证**: ...

    springboot-security-oauth2 权限验证

    本项目“springboot-security-oauth2”旨在实现基于Spring Boot的权限验证机制,利用Security的认证和授权功能,以及OAuth2的授权框架,为应用程序提供安全的访问控制。 首先,Spring Boot是Spring框架的简化版,它...

    Spring security oauth源码

    同时,了解这些源码也有助于调试和解决Spring Security OAuth在实际项目中遇到的问题。 总之,Spring Security OAuth源码提供了一个深入了解OAuth 2.0协议及其在Spring生态系统中实现的绝佳机会。通过研究Sparklr2...

    webapi基于Owin中间件的oauth2.0身份认证

    OAuth2.0是一种授权框架,广泛应用于Web API的身份验证和授权。它允许第三方应用在用户授权的情况下,访问该用户的特定资源,而无需获取用户的用户名和密码。OAuth2.0的核心是将认证和授权分离,提高了安全性,同时...

    Python-Authlib是一个实现OAuth1OAuth2身份验证的客户端和服务端

    - **安全**: 提供了强大的签名算法和加密方法,确保数据传输的安全。 - **文档齐全**: 官方文档详细且易懂,帮助开发者快速上手。 在使用`Authlib`时,开发者需要理解OAuth的工作流程,包括授权码流、隐式流、...

    java实现oauth2.0服务端+客户端(含JWT)

    OAuth 2.0 是一个授权框架,用于安全地允许第三方应用访问用户存储在另一服务上的资源,而无需共享用户凭证。在这个Java实现中,我们利用了MAVEN作为项目管理工具和OLTU库来构建OAuth 2.0服务端和客户端。同时,数据...

    前端开源库-oauth-signature

    - 调用签名函数:根据请求类型和参数,调用对应的签名方法,如`oauth.hmac_sha1()`或`oauth.rsa_sha1()`。 - 添加签名到请求头:将生成的签名添加到OAuth相关的请求头字段中,如`Authorization`。 总之,`oauth-...

    Spring cloud Oauth2的密码模式使用JWT方式实现登录验证授权

    Spring Cloud Oauth2和JWT(JSON Web Token)的结合提供了高效且灵活的解决方案。本文将深入探讨如何使用Spring Cloud Oauth2的密码模式和JWT来实现登录验证授权。 首先,OAuth2是一个开放标准,用于授权第三方应用...

    Jwt.zip_jwt_oauth2.0_oauth2.0 加解密_php解密工具

    OAuth 2.0 是一个授权框架,它允许第三方应用在用户许可的情况下访问其私有资源。OAuth 2.0 主要用于 API 的身份验证和授权,如 Google、Facebook 和 GitHub 等大型服务提供商广泛使用它来管理用户授权。 在 OAuth ...

    Python-OAuthLib一个OAuth请求签名逻辑通用完整的实现

    例如,对于OAuth 1.0a,可以使用`oauth_request()`函数生成签名后的请求,而对于OAuth 2.0,可能需要调用`fetch_token()`来获取访问令牌。 `oauthlib-oauthlib-31cae75`这个文件名可能指的是OAuthLib库的某个特定...

Global site tag (gtag.js) - Google Analytics