hive插件 ranger_Apache Ranger及Hive權限控制

一、Ranger概述

1.Ranger簡介

Apache Ranger提供一個集中式安全管理框架, 并解決授權和審計。它可以對Hadoop生態的組件如HDFS、Yarn、Hive、Hbase等進行細粒度的數據訪問控制。通過操作Ranger控制臺,管理員可以輕松的通過配置策略來控制用戶訪問權限。

本文章介紹Ranger與Hive集成過程,與使用方法

2.Ranger包含以下組件

Ranger Admin 用戶管理策略,提供WebUI和RestFul接口

Ranger UserSync 用于將Unix系統或LDAP用戶/組同步到RangerAdmin

Ranger TagSync 同步Atlas中的Tag信息

Ranger KMS

000.jpg

3.Ranger依賴的組件:

JDK 運行RangerAdmin RangerKMS

RDBMS 1.存儲授權策略 2.存儲Ranger 用戶/組 3.存儲審核日志

Solr(可選) 存儲審核日志

HDFS(可選) 存儲審核日志

Kerberos(可選) 確保所有請求都被認證

4.目前Ranger0.7支持的Plugin

HDFS

YARN

SOLR

ATLAS

HBASE

KNOX

KAFKA

HIVE

STORM

NIFI

二、Ranger編譯安裝

說明: Ranger可以在Ambari上直接安裝。開啟AmbariHivePlugin也可以直接在頁面上操作。

但如果跟ApacheHive集成的話,需要先編譯出ApacheRanger的HivePlugin來

1.Apache Ranger編譯

#Install maven git gcc mysql

git clone https://github.com/apache/ranger.git

cd ranger

git checkout release-ranger-0.7.1

mvn clean compile package assembly:assembly install -DskipTests

ls target

2.通過Ambari安裝Ranger

前置條件:

1.必須有 MySQL/Oracle/Postgres/MSSQL/SQL Anywhere Server 數據庫實例

2.在RangerAdmin主機上 必須安裝DB Client

3.確保DB Admin用戶可以再其他機器上登陸(用來創建ranger用戶)

4.執行下面的命令 導入JDBC驅動 ambari-server setup –jdbc-db={database-type} –jdbc-driver={/jdbc/driver/path}

#導入JDBC驅動:

#(MySQL JDBC Driver Jar包下載頁面:https://dev.mysql.com/downloads/connector/j/5.0.html)

wget https://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-java-5.0.8.tar.gz

tar -zxvf mysql-connector-java-5.0.8.tar.gz

ambari-server setup --jdbc-db=mysql --jdbc-driver=mysql-connector-java-5.0.8/mysql-connector-java-5.0.8-bin.jar

3.安裝RangerHivePlugin

登陸RangerAdmin: http://l-node1.data.beta.cn0:6080

#AmbariHive可直接在Ambari頁面上操作

#ApacheHive的話 需要執行以下命令:

# 1.拷貝RangerHivePlugin安裝包

cp target/ranger-0.7.1-hive-plugin.tar.gz /usr/apache

tar -zxvf /usr/apache/ranger-0.7.1-hive-plugin.tar.gz

# 2.編輯install.properties文件

#編輯POLICY_MGR_URL 指向RangerAdmin 例如 POLICY_MGR_URL=http://l-node1.data.beta.cn0:6080

#編輯REPOSITORY_NAME 要與RangerAdmin中ServiceName配置一致 例如 REPOSITORY_NAME=hivebeta

vim /usr/apache/ranger-0.7.1-hive-plugin/install.properties

# 3.配置JAVA_HOME HIVE_HOME 環境變量

echo "export JAVA_HOME=/usr/java/jdk1.8.0_141" >> /etc/bashrc

echo "export HIVE_HOME=/usr/apache/hive" >> /etc/bashrc

source /etc/bashrc

# 4.開啟plugin

sudo sh /usr/apache/ranger-0.7.1-hive-plugin/enable-hive-plugin.sh

#顯示Ranger Plugin for hive has been enabled. Please restart hive to ensure that changes are effective.即成功

# 5.重啟HiveServer

4.RangerAdmin上面配置要管理的HiveServer實例

001.png

002.png

三、Ranger Hive權限控制

1.準備測試數據

點擊hivebeta 開始Hive權限控制

003.png

根據我們剛才的配置,hive用戶擁有all權限

使用beeline登陸

[hive@l-node3 hive]$ bin/beeline

SLF4J: Class path contains multiple SLF4J bindings.

SLF4J: Found binding in [jar:file:/usr/apache/apache-hive-2.3.0-bin/lib/log4j-slf4j-impl-2.6.2.jar!/org/slf4j/impl/StaticLoggerBinder.class]

SLF4J: Found binding in [jar:file:/usr/hdp/2.6.1.0-129/hadoop/lib/slf4j-log4j12-1.7.10.jar!/org/slf4j/impl/StaticLoggerBinder.class]

SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.

SLF4J: Actual binding is of type [org.apache.logging.slf4j.Log4jLoggerFactory]

Beeline version 2.3.0 by Apache Hive

beeline> !connect jdbc:hive2://l-node1.data.beta.cn0:2181,l-node2.data.beta.cn0:2181,l-node3.data.beta.cn0:2181/;serviceDiscoveryMode=zooKeeper;zooKeeperNamespace=hiveserver2_ha

Connecting to jdbc:hive2://l-node1.data.beta.cn0:2181,l-node2.data.beta.cn0:2181,l-node3.data.beta.cn0:2181/;serviceDiscoveryMode=zooKeeper;zooKeeperNamespace=hiveserver2_ha

Enter username for jdbc:hive2://l-node1.data.beta.cn0:2181,l-node2.data.beta.cn0:2181,l-node3.data.beta.cn0:2181/: hive

Enter password for jdbc:hive2://l-node1.data.beta.cn0:2181,l-node2.data.beta.cn0:2181,l-node3.data.beta.cn0:2181/:

17/08/03 11:49:28 [main]: INFO jdbc.HiveConnection: Connected to l-node5.data.beta.cn0:10000

Connected to: Apache Hive (version 2.3.0)

Driver: Hive JDBC (version 2.3.0)

Transaction isolation: TRANSACTION_REPEATABLE_READ

#創建ranger測試庫

0: jdbc:hive2://l-node1.data.beta.cn0:2181,l-> create database ranger_test_db;

No rows affected (0.259 seconds)

0: jdbc:hive2://l-node1.data.beta.cn0:2181,l-> use ranger_test_db;

No rows affected (0.114 seconds)

#創建測試表

0: jdbc:hive2://l-node1.data.beta.cn0:2181,l-> CREATE TABLE t_user

. . . . . . . . . . . . . . . . . . . . . . .> (name STRING,phone STRING)

. . . . . . . . . . . . . . . . . . . . . . .> ROW FORMAT DELIMITED

. . . . . . . . . . . . . . . . . . . . . . .> FIELDS TERMINATED BY '\t'

. . . . . . . . . . . . . . . . . . . . . . .> STORED AS TEXTFILE;

No rows affected (0.317 seconds)

# 表數據

[hive@l-node3 hive]$ hadoop fs -cat /tmp/t_user.data

meizi 18518760001

xuaner 18518760002

afa 18518760003

hanze 18518760004

xupeng 18518760005

xiaofeng 18518760006

shuoshuo 18518760007

# 導入數據

0: jdbc:hive2://l-node1.data.beta.cn0:2181,l-> LOAD DATA INPATH '/tmp/t_user.data' INTO TABLE t_user;

No rows affected (0.523 seconds)

#查詢成功

0: jdbc:hive2://l-node1.data.beta.cn0:2181,l-> select * from t_user;

+--------------+---------------+

| t_user.name | t_user.phone |

+--------------+---------------+

| meizi | 18518760001 |

| xuaner | 18518760002 |

| afa | 18518760003 |

| hanze | 18518760004 |

| xupeng | 18518760005 |

| xiaofeng | 18518760006 |

| shuoshuo | 18518760007 |

+--------------+---------------+

7 rows selected (0.11 seconds)

2.HiveAccess(對庫、表、列的授權)

# 在Ranger UserSync機器上創建測試用戶rangeruser1

[root@l-node1 ~]# useradd rangeruser1

# 測試未授權的用戶

[hive@l-node3 hive]$ bin/beeline

SLF4J: Class path contains multiple SLF4J bindings.

SLF4J: Found binding in [jar:file:/usr/apache/apache-hive-2.3.0-bin/lib/log4j-slf4j-impl-2.6.2.jar!/org/slf4j/impl/StaticLoggerBinder.class]

SLF4J: Found binding in [jar:file:/usr/hdp/2.6.1.0-129/hadoop/lib/slf4j-log4j12-1.7.10.jar!/org/slf4j/impl/StaticLoggerBinder.class]

SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.

SLF4J: Actual binding is of type [org.apache.logging.slf4j.Log4jLoggerFactory]

Beeline version 2.3.0 by Apache Hive

beeline> !connect jdbc:hive2://l-node1.data.beta.cn0:2181,l-node2.data.beta.cn0:2181,l-node3.data.beta.cn0:2181/;serviceDiscoveryMode=zooKeeper;zooKeeperNamespace=hiveserver2_ha

Connecting to jdbc:hive2://l-node1.data.beta.cn0:2181,l-node2.data.beta.cn0:2181,l-node3.data.beta.cn0:2181/;serviceDiscoveryMode=zooKeeper;zooKeeperNamespace=hiveserver2_ha

#使用rangeruser1用戶登陸

Enter username for jdbc:hive2://l-node1.data.beta.cn0:2181,l-node2.data.beta.cn0:2181,l-node3.data.beta.cn0:2181/: rangeruser1

Enter password for jdbc:hive2://l-node1.data.beta.cn0:2181,l-node2.data.beta.cn0:2181,l-node3.data.beta.cn0:2181/:

17/08/03 12:30:58 [main]: INFO jdbc.HiveConnection: Connected to l-node5.data.beta.cn0:10000

Connected to: Apache Hive (version 2.3.0)

Driver: Hive JDBC (version 2.3.0)

Transaction isolation: TRANSACTION_REPEATABLE_READ

# use db; select table; 等訪問全部被拒絕

0: jdbc:hive2://l-node1.data.beta.cn0:2181,l-> use ranger_test_db;

Error: Error while compiling statement: FAILED: HiveAccessControlException Permission denied: user [rangeruser1] does not have [USE] privilege on [ranger_test_db] (state=42000,code=40000)

0: jdbc:hive2://l-node1.data.beta.cn0:2181,l-> select * from ranger_test_db.t_user;

Error: Error while compiling statement: FAILED: HiveAccessControlException Permission denied: user [rangeruser1] does not have [SELECT] privilege on [ranger_test_db/t_user/*] (state=42000,code=40000)

給rangeruser1用戶授權

點擊Add New Policy給rangeruser1用戶授予ranger_test_db.t_user.* select權限

004.png

#select成功

0: jdbc:hive2://l-node1.data.beta.cn0:2181,l-> use ranger_test_db;

No rows affected (0.127 seconds)

0: jdbc:hive2://l-node1.data.beta.cn0:2181,l-> select * from t_user;

+--------------+---------------+

| t_user.name | t_user.phone |

+--------------+---------------+

| meizi | 18518760001 |

| xuaner | 18518760002 |

| afa | 18518760003 |

| hanze | 18518760004 |

| xupeng | 18518760005 |

| xiaofeng | 18518760006 |

| shuoshuo | 18518760007 |

+--------------+---------------+

7 rows selected (0.12 seconds)

#刪除表 被拒絕

0: jdbc:hive2://l-node1.data.beta.cn0:2181,l-> drop table t_user;

Error: Error while compiling statement: FAILED: HiveAccessControlException Permission denied: user [rangeruser1] does not have [DROP] privilege on [ranger_test_db/t_user] (state=42000,code=40000)

#創建表 被拒絕

0: jdbc:hive2://l-node1.data.beta.cn0:2181,l-> CREATE TABLE t_user2

. . . . . . . . . . . . . . . . . . . . . . .> (name STRING,phone STRING)

. . . . . . . . . . . . . . . . . . . . . . .> ROW FORMAT DELIMITED

. . . . . . . . . . . . . . . . . . . . . . .> FIELDS TERMINATED BY '\t'

. . . . . . . . . . . . . . . . . . . . . . .> STORED AS TEXTFILE;

Error: Error while compiling statement: FAILED: HiveAccessControlException Permission denied: user [rangeruser1] does not have [CREATE] privilege on [ranger_test_db/t_user2] (state=42000,code=40000)

Delegate Admin(委托管理員)說明: 如果一個Condition中的 用戶/組 為Delegate Admin,那么該 用戶/組 可以修改上面resource的權限 并可以把此resource授權給其他人

也可以使用SQL進行授權(授權過的記錄同樣會顯示在RangerAdmin上):

GRANT SELECT ON TABLE ranger_test_db.t_user TO USER fengjie;

3.Masking(動態列屏蔽)

動態列屏蔽: 可以將一列數據進行屏蔽操作 如哈希、加密、打馬賽克等

添加一個Masking Policy

005.png

006.png

Select Masking Option里面填Mask的選項,默認有: 顯示前4位、顯示后4位、哈希、Null值、日期類型僅顯示年等。我們這里使用Custom自定義,

其實就是寫Select子句 可以根據邏輯自己實現,也可使用UDF。本例中我們使用concat(substr(phone,1,7),'****')將手機號的后四位屏蔽掉

0: jdbc:hive2://l-node1.data.beta.cn0:2181,l-> select * from t_user;

+--------------+---------------+

| t_user.name | t_user.phone |

+--------------+---------------+

| meizi | 1851876**** |

| xuaner | 1851876**** |

| afa | 1851876**** |

| hanze | 1851876**** |

| xupeng | 1851876**** |

| xiaofeng | 1851876**** |

| shuoshuo | 1851876**** |

+--------------+---------------+

7 rows selected (0.173 seconds)

4.Row Level Filter(行級別過濾)

行級別過濾: 可以過濾掉行數據。比如訂單表,北京的員工僅允許看北京的訂單數據,其他地區的數據被強制過濾掉

添加一個Row Level Filter Policy

007.png

008.png

Row Level Filter里面填Filter的過濾規則,其實就是寫Where子句。本例中我們使用name <> 'hanze'將 name為’hanze’的用戶過濾掉

#hanze用戶已經被過濾掉,不顯示在結果中了

0: jdbc:hive2://l-node1.data.beta.cn0:2181,l-> select * from t_user;

+--------------+---------------+

| t_user.name | t_user.phone |

+--------------+---------------+

| meizi | 1851876**** |

| xuaner | 1851876**** |

| afa | 1851876**** |

| xupeng | 1851876**** |

| xiaofeng | 1851876**** |

| shuoshuo | 1851876**** |

+--------------+---------------+

6 rows selected (0.164 seconds)

四、基于TAG的權限控制

Apache Ranger可以和Apache Atlas(數據治理,元數據倉儲)組件一起使用,它可以定義一種基于標簽的安全服務,通過使用標簽對文件和數據資產進行分類,并控制用戶和用戶組對一系列標簽的訪問。

Apache Atlas里面可以對資源打Tag。打了Tag后 我們可以在這里根據Tag來控制權限

(注意:因需要集成Atlas 此功能暫未驗證)

1.添加TagService

009.png

010.png

2.添加TagPolicy

011.png

012.png

上圖的Policy,實現了這樣的場景:

產品組(product)可以訪問帶”TAG”標簽的資源; 但實習生(intern)不靠譜 實習生沒有訪問權限; 但因實習生中的meizi表現突出 給他賦予訪問權限

3.授權流程:

013.png

先檢查基于Tag的權限是否拒絕,如果拒絕的話,報錯退出。

如果不拒絕,再檢查基于Resource的權限拒不拒絕。

如果不拒絕,再檢查Tag的權限允不允許,Resource的權限允不允許。

五、Audit審計記錄

1.Access

此頁面記錄每次授權的信息 包括策略id、時間、訪問用戶、訪問的資源、訪問的類型、授權結果等信息。可以根據條件進行搜索

開啟此功能需要先安裝Solr

014.png

2.Admin

此頁面記錄對策略的操作

015.png

3.Login Sessions

此頁面記錄登陸RangerAdmin的操作

016.png

4.Plugins

記錄Plugins的同步策略

017.png

5.Pugins Status

Plugin的狀態

018.png

六、RestAPI

以上在RangerAdminWeb上操作的東西 都可以在RestAPI里面操作。

比如 添加服務、更新服務、刪除服務、搜索服務、獲取策略、創建策略、更新策略、刪除策略、搜索策略等

API name Create Policy

Request Type POST

Request URL service/public/v2/api/policy

Request Parameters Application/json

Hive Example:

{

"policyName": "FinancePolicy",

"databases": "finance,hr",

"tables": "invoices,emps",

"columns": "amt, emp_id",

"udfs": "",

"description": "Hive Policy",

"repositoryName": "hivedev",

"repositoryType": "hive",

"tableType": "Exclusion",

"columnType": "Inclusion",

"isEnabled": true,

"isAuditEnabled": true,

"permMapList": [

{

"userList": [

"john",

"andrew"

],

"permList": [

"Write",

"Admin"

]

},

{

"userList": [

"hr"

],

"groupList": [

"admin"

],

"permList": [

"Read",

"Write",

"Admin"

]

}

]

}

參考文檔

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/445882.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/445882.shtml
英文地址,請注明出處:http://en.pswp.cn/news/445882.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

openssl編程-基礎知識-OpenSSL簡介

參考鏈接 在ubuntu環境下執行openssl編譯和安裝_MY CUP OF TEA的博客-CSDN博客_openssl ubuntuOpenSSL編程 趙春平 OpenSSL 簡介 它提供的主要功能有&#xff1a;SSL協議實現(包括SSLv2、SSLv3和TLSv1)、大量軟算法(對稱/非對稱/摘要)、大數運算、非對稱算法密鑰生成、ASN.1編…

linux修改文件句柄數生效_linux系統層面調優和常見的面試題

linux系統層面調優和常見的面試題?mp.weixin.qq.com無論對Spark集群&#xff0c;還是Hadoop集群等大數據相關的集群進行調優&#xff0c;對linux系統層面的調優都是必不可少的&#xff0c;這里主要介紹3種常用的調優&#xff1a;1.linux文件句柄linux在整個系統層面和單個進程…

openssl編程-基礎知識-OpenSSL堆棧

堆棧介紹 堆棧是一種先進后出的數據結構openssl 大量采用堆棧來存放數據。它實現了一 個通用的堆棧&#xff0c;可以方便的存儲任意數據它實現了許多基本的堆棧操作&#xff0c;主要有&#xff1a;堆棧拷貝(sk_dup)、構建新堆棧&#xff08;sk_new_null&#xff0c;sk_new&…

小米用戶畫像_企鵝智庫:高學歷用蘋果中老年用華為 男性用小米女性用OV

不同手機品牌都有著自己不同的定位人群&#xff0c;在國內市場目前幾大非常有名的手機品牌分別被三星、蘋果、華為、小米、OV占據&#xff0c;而這些手機品牌的主要購買人群到底是什么樣的呢&#xff1f;企鵝智庫近日發布了一份手機消費者的調研報告&#xff0c;并且根據消費者…

國密gmtls協議-雙證書體系的服務端和客戶端通信代碼

內容介紹 國密的雙證書體系&#xff0c;將證書按照使用目的的不同劃分為加密證書和簽名證書兩種&#xff0c;也就是兩對公私鑰&#xff0c;二者本質一致&#xff0c;均為SM2密鑰對&#xff0c;區別僅體現在用法國密CA體系中&#xff0c;加密密鑰對由CA產生&#xff0c;簽名密鑰…

jwt 私鑰_什么是 JSON Web Token(JWT)

有關本文檔的快速鏈接&#xff0c;請參考頁面提示。什么是 JSON Web Token(JWT)?JSON Web Token (JWT) 作為一個開放的標準 (RFC 7519) 定義了一種簡潔自包含的方法用于通信雙方之間以 JSON 對象的形式安全的傳遞信息。因為有數字簽名&#xff0c;所以這些通信的信息能夠被校驗…

server和client之間進行Socket通信,進行數據切片

參考鏈接 send函數和recv函數 – gudakos memo 注意事項 代碼很low&#xff0c;主要看封裝的Send函數所體現的切片思想即可 server代碼 //udp服務端 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/types.h> #include …

天線下傾角示意圖_常用天線和無源器件技術參數匯總

原標題&#xff1a;常用天線和無源器件技術參數匯總一、天線原理天線的定義&#xff1a; 能夠有效地向空間某特定方向輻射電磁波或能夠有效的接收空間某特定方向來的電磁波的裝置。天線的功能&#xff1a; 能量轉換-導行波和自由空間波的轉換; 定向輻射(接收)-具有一定的方向性…

制作作品圖片_不懂人文后期制作流程?來,大師手把手教你

制作前1、處理一張照片思路決定步驟 想要了解學習的老師可以私聊小編fzhdyx222制作后2、2020年最新Camera Raw局部影調和色調的控制想要了解學習的老師可以私聊小編fzhdyx222制作前3、2020年最新Camera Raw基礎工具細節性運用想要了解學習的老師可以私聊小編fzhdyx222制作后4、…

xlsx文件打開亂碼_Excel 2016 雙擊無法打開xlsx文件怎么辦?

最近我重裝了系統(Win10Office2016)&#xff0c;然后發現了一個奇怪的bug&#xff1a;雙擊xlsx文件&#xff0c;只能打開Excel窗口&#xff0c;但是打不開這個文件&#xff0c;有時候再次雙擊就能打開了&#xff0c;但有時再次雙擊也不管用&#xff0c;需要在Excel的菜單中點“…

gmssl使用雙證書雙向認證的gmtl協議報錯crypto/sm2/sm2_sign.c 510: sm2_do_verifySSL3 alert write:fatal:decrypt error

報錯內容 crypto/sm2/sm2_sign.c 510: sm2_do_verify SSL3 alert write:fatal:decrypt error SSL_accept:error in error ERROR 140655864152064:error:1417B07B:SSL routines:tls_process_cert_verify:bad signature:ssl/statem/statem_srvr.c:2941: 相關內容 版本&#xf…

糾偏的意思_承壓能力和糾偏能力,決定成長的高度

承壓能力&#xff0c;包含抗壓能力、抵御能力&#xff0c;擔當能力&#xff0c;分解能力&#xff0c;消化能力&#xff0c;釋放能力&#xff0c;等一系列的精神要素&#xff0c;是一個人生存生活工作中一項重要的素質。有的人&#xff0c;承壓能力很強&#xff0c;無論經受什么…

《Java8實戰》筆記(15):面向對象和函數式編程的混合-Java 8和Scala的比較

面向對象和函數式編程的混合&#xff1a;Java 8和Scala的比較 Scala是一種混合了面向對象和函數式編程的語言。它常常被看作Java的一種替代語言&#xff0c;程序員們希望在運行于JVM上的靜態類型語言中使用函數式特性&#xff0c;同時又期望保持Java體驗的一致性。和Java比較起…

函數指針作為形參進行調用

代碼 兩個代碼均位于namespace作用域之內addOne將傳遞進來的形參進行加一&#xff0c;然后返回performance_test函數主要是想簡化函數調用&#xff0c;兩個形參&#xff0c;第一個表示循環的次數&#xff0c;第二個是帶參數的函數指針&#xff0c;函數內部初始化start和end兩個…

python中fetchall_Python連接MySQL并使用fetchall()方法過濾特殊字符

來一個簡單的例子&#xff0c;看Python如何操作數據庫&#xff0c;相比Java的JDBC來說&#xff0c;確實非常簡單&#xff0c;省去了很多復雜的重復工作&#xff0c;只關心數據的獲取與操作。準備工作需要有相應的環境和模塊&#xff1a;Ubuntu 14.04 64bitPython 2.7.6MySQLdb注…

《Java8實戰》筆記(16):結論以及Java的未來

結論以及Java的未來 回顧Java8的語言特性 行為參數化&#xff08;Lambda以及方法引用&#xff09; 流 CompletableFuture Optional 默認方法 Java的未來 集合 類型系統的改進 聲明位置變量 更多的類型推斷 模式匹配 更加豐富的泛型形式 具化泛型 泛型中特別為函…

解決吉大正源(身份認證網關|USBKey)和gmssl(server|client)使用gmtl協議交叉互通報錯tlsv1 alert decrypt error

報錯內容 SSL_connect:error in SSLv3/TLS write finished140057291788288:error:1409441B:SSL routines:ssl3_read_bytes:tlsv1 alert decrypt error:ssl/record/rec_layer_s3.c:1385:SSL alert number 51 報錯原因 gmssl庫生成 certificate verify 消息時&#xff0c;對自客…

12無法使用otg_12個冷知識:或許只能看看而無法使用,但卻真實存在著

12個或許只能看看而無法使用&#xff0c;但卻真實存在著。臉紅一所有已知動物中&#xff0c;唯一可以臉紅的是人類。二有些地區將雨水歸類為公共財物&#xff0c;作為公共財物是不允許收集的&#xff0c;違反者將面臨處罰。三世界上汽車研發成本最高的一款車是福特蒙迪歐&#…

《Java8實戰》筆記匯總

《Java8實戰》筆記&#xff08;01&#xff09;&#xff1a;為什么要關心Java8 《Java8實戰》筆記&#xff08;02&#xff09;&#xff1a;通過行為參數傳遞代碼 《Java8實戰》筆記&#xff08;03&#xff09;&#xff1a;Lambda表達式 《Java8實戰》筆記&#xff08;04&…

三目運算符_C語言知識點:運算符的優先級和結合性

運算符是一種告訴編譯器執行特定的數學或邏輯操作的符號。C語言內置了豐富的運算符&#xff0c;大體可分為10類&#xff1a;算術運算符、關系運算符、邏輯運算符、位操作運算符、賦值運算符、條件運算符、逗號運算符、指針運算符、求字節數運算符和特殊運算符。根據運算符可操作…