gRPC Android SSL/TLS Demo(Android上帶有SSL/TLS加密的gRPC使用詳解)

最近項目有用到gRPC來發(fā)起請求,并且需要用到加密肾档。做的過程中也是各種坑摹恰,官網(wǎng)文檔也不詳細,網(wǎng)上資料也不多怒见。我把過程都記錄一下俗慈,希望能幫助到有需要的朋友。

最近有朋友說構(gòu)建時不成功遣耍,findbugs的包報錯(當(dāng)然這個只是靜態(tài)分析用的闺阱,去掉也可以),這里在gradle文件中加上這句話即可(下面的gradle示例代碼中已經(jīng)加上):
configurations.all { resolutionStrategy.force 'com.google.code.findbugs:jsr305:3.0.1'}

1舵变、gRPC介紹

定義介紹就不說了網(wǎng)上一大堆酣溃,簡單理解就是google新推出的一種通信協(xié)議,定義好proto文件纪隙,客戶端和服務(wù)端都可以自動生成相關(guān)的方法和對象赊豌,調(diào)用接口時直接使用這些生成好的文件,幫助開發(fā)者更多的關(guān)注業(yè)務(wù)绵咱。

需要注意的是:官方案例中要各種編譯對應(yīng)語言的文件,編譯過程中下載相關(guān)的文件速度特別慢悲伶,各種坑艾恼。其實Android使用時只需要導(dǎo)入插件和lib庫,就可以自動編譯好相關(guān)的java文件供調(diào)用拢切。

2蒂萎、proto文件

拿一段官網(wǎng)的proto案例介紹

proto文件.png

這個類名service Greeter編譯后會自動生成GreeterGrpc,通過GreeterGrpc調(diào)用里面的方法比如SayHello淮椰。另外假如類名service User五慈,就會生成UserGrpc
HelloRequest也會自動生成相應(yīng)的類,到時直接使用主穗。這就省去了建實體類以及請求數(shù)據(jù)的方法的步驟泻拦,省事了很多

這里推薦proto文件(有個P的小圖標(biāo)后文會提到)放在和java同一級目錄下:

同級目錄.png

3、環(huán)境配置

需要配置protobuf插件和庫用來自動生成gRPC文件忽媒。
在最外層的build.gradle下加上

apply plugin: 'com.android.application'
apply plugin: 'com.google.protobuf'


android {
    compileSdkVersion 24
    buildToolsVersion "24.0.0"
    defaultConfig {
        applicationId "com.xxx.xxx.xxxxx"
        minSdkVersion 15
        targetSdkVersion 24
        versionCode 1
        versionName "1.0"
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    lintOptions {
        disable 'InvalidPackage'
    }

    configurations.all {    
         resolutionStrategy.force 'com.google.code.findbugs:jsr305:3.0.1'
    }
}

protobuf {
    protoc {
        artifact = 'com.google.protobuf:protoc:3.0.0'
    }
    plugins {
        javalite {
            artifact = "com.google.protobuf:protoc-gen-javalite:3.0.0"
        }
        grpc {
            artifact = 'io.grpc:protoc-gen-grpc-java:1.0.0'
        }
    }
    generateProtoTasks {
        all().each { task ->
            task.plugins {
                javalite {}
                grpc {
                    // Options added to --grpc_out
                    option 'lite'
                }
            }
        }
    }
}

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')

    //grpc need
    compile 'io.grpc:grpc-okhttp:1.0.0'
    compile 'io.grpc:grpc-protobuf-lite:1.0.0'
    compile 'io.grpc:grpc-stub:1.0.0'
    
    compile 'com.google.code.findbugs:jsr305:3.0.0'
    compile 'com.google.guava:guava:18.0'
    compile 'javax.annotation:javax.annotation-api:1.2'
}

注意點
1争拐、grpc { artifact = 'io.grpc:protoc-gen-grpc-java:1.0.0'}
這句話一定要有,不然自動生成的java文件沒有GreeterGrpc晦雨,就無法調(diào)用方法了

2架曹、配置好gradle隘冲,gradle構(gòu)建時會提示安裝插件(頂部的 apply plugin: 'com.google.protobuf'),就是這個插件

插件.png

安裝后绑雄,項目中proto文件前面就會出現(xiàn)個P字的小圖標(biāo)

插件效果.png

3展辞、官網(wǎng)案例中的版本都是1.1.0-SNAPSHOT,但是我在實踐的過程中發(fā)現(xiàn)根本下不了万牺,不存在這個版本罗珍,這里建議使用1.0.0
compile 'io.grpc:grpc-okhttp:1.0.0'
compile 'io.grpc:grpc-protobuf-lite:1.0.0'
compile 'io.grpc:grpc-stub:1.0.0'

4、另外脚粟,gradle版本可能也會影響到構(gòu)建覆旱,最好使用最新的版本

5、findbugs的包報錯核无,這里在gradle文件中加上這句話即可:
configurations.all { resolutionStrategy.force 'com.google.code.findbugs:jsr305:3.0.1'}
其實這個findbugs不要也沒關(guān)系

6扣唱、工程根目錄的gradle文件中要有這句:
classpath "com.google.protobuf:protobuf-gradle-plugin:0.8.0"

Paste_Image.png

特別注意~~~~
gradle構(gòu)建時下載速度很慢,一定要耐心等待厕宗,通過查看gradle日志來跟蹤構(gòu)建過程画舌,我當(dāng)時一直在running了10來分鐘,以為斷了就關(guān)掉重來已慢,花費了很長時間才搞明白其實它是在下載相關(guān)的文件曲聂,日志顯示正在下載,只是速度非常慢佑惠,即使翻墻速度也很慢朋腋。

日志.png

構(gòu)建好后,rebuild一下項目就會自動根據(jù)項目目錄中的proto文件生成對應(yīng)的java文件膜楷,我項目的文件如下:

生成文件.png

這時就可以進行開發(fā)了旭咽。


4、gRPC Android使用方法(主要是SSL/TLS加密驗證)

官網(wǎng)也有使用案例:

官網(wǎng)案例.png

不過它這個沒有使用加密

這里說下gRPC的加密赌厅,官方文檔中也有介紹穷绵,分為:
1、服務(wù)端認證加密使用的 SSL/TLS
2特愿、通過 Google 進行認證
3仲墨、開發(fā)者自定義的加密憑證

可以參考官網(wǎng)文檔 , 中文版文檔


我們項目用的是SSL/TLS協(xié)議來加密,這里就有坑了:
官網(wǎng)給了一段java案例:

// With server authentication SSL/TLS
ManagedChannel channel = ManagedChannelBuilder.forAddress("myservice.example.com", 443)
    .build();
GreeterGrpc.GreeterStub stub = GreeterGrpc.newStub(channel);

// With server authentication SSL/TLS; custom CA root certificates; not on Android
ManagedChannel channel = NettyChannelBuilder.forAddress("myservice.example.com", 443)
    .sslContext(GrpcSslContexts.forClient().trustManager(new File("roots.pem")).build())
    .build();
GreeterGrpc.GreeterStub stub = GreeterGrpc.newStub(channel);

這句not on Android就坑爹了揍障,Android端生成的文件中根本沒有NettyChannelBuilder這個東西目养。不過幸好還有一段小字:

If the issuing certificate authority is not known to the client then a properly configured SslContext or SSLSocketFactory should be provided to the NettyChannelBuilder or **OkHttpChannelBuilder******, respectively.

還有OkHttpChannelBuilder官方給的案例也沒有提到這玩意,其實實例化這里需要這樣:

ManagedChannel channel = OkHttpChannelBuilder.forAddress("xxx",yyy)
                        .overrideAuthority("zzz")
                        .sslSocketFactory(sslFactory)
                        .build();


1毒嫡、千萬不要像官網(wǎng)案例那樣設(shè)置setPlaintext(true)癌蚁,這個是設(shè)置明文,我們用的是密文

2、xxx是服務(wù)器的ip努释,yyy是端口號碘梢,zzz是domain(這些參數(shù)服務(wù)端都會提供給你)
特別注意這個overrideAuthority一定要調(diào)用,覆蓋hostname來匹配服務(wù)器的證書

3伐蒂、sslSocketFactory這個方法就是設(shè)置密鑰的方法痘系。一般服務(wù)端會提供個.pem的密鑰文件,放在raw中饿自。我們把這個密鑰設(shè)置到OkHttpChannelBuilder中即可以訪問服務(wù)器了,關(guān)于sslSocketFactory 網(wǎng)上可以搜索到很多有關(guān)的內(nèi)容龄坪。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末昭雌,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子健田,更是在濱河造成了極大的恐慌烛卧,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件妓局,死亡現(xiàn)場離奇詭異总放,居然都是意外死亡,警方通過查閱死者的電腦和手機好爬,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進店門局雄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人存炮,你說我怎么就攤上這事炬搭。” “怎么了穆桂?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵宫盔,是天一觀的道長。 經(jīng)常有香客問我享完,道長灼芭,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任般又,我火速辦了婚禮彼绷,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘倒源。我一直安慰自己苛预,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布笋熬。 她就那樣靜靜地躺著热某,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上昔馋,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天筹吐,我揣著相機與錄音,去河邊找鬼秘遏。 笑死丘薛,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的邦危。 我是一名探鬼主播洋侨,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼倦蚪!你這毒婦竟也來了希坚?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤陵且,失蹤者是張志新(化名)和其女友劉穎裁僧,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體慕购,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡聊疲,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了沪悲。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片获洲。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖可训,靈堂內(nèi)的尸體忽然破棺而出昌妹,到底是詐尸還是另有隱情,我是刑警寧澤握截,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布飞崖,位于F島的核電站,受9級特大地震影響谨胞,放射性物質(zhì)發(fā)生泄漏固歪。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一胯努、第九天 我趴在偏房一處隱蔽的房頂上張望牢裳。 院中可真熱鬧,春花似錦叶沛、人聲如沸蒲讯。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽判帮。三九已至局嘁,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間晦墙,已是汗流浹背悦昵。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留晌畅,地道東北人但指。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像抗楔,于是被迫代替她去往敵國和親棋凳。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,577評論 2 353

推薦閱讀更多精彩內(nèi)容