Skip to content

Commit c1ecc75

Browse files
committed
tls sig api for python 2.7
1 parent 7f85ed7 commit c1ecc75

File tree

3 files changed

+131
-0
lines changed

3 files changed

+131
-0
lines changed

TLSSigAPI.py

Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
#! /usr/bin/python
2+
# coding:utf-8
3+
4+
# 此文件是 tls sig api 的 python 另一种实现
5+
# 使用了 python ecdsa 开发库
6+
7+
__author__ = "tls@tencent.com"
8+
__date__ = "$Oct 2, 2016 11:17:43 PM"
9+
10+
import base64
11+
import zlib
12+
import json
13+
import time
14+
15+
# python ecdsa 开发库请到 https://github.com/warner/python-ecdsa
16+
# 或者 tls 技术支持分享的链接 http://share.weiyun.com/24b674bced4f84ecbbe6a7945738b9f4
17+
# 下载,下载完毕之后进入其根目录,运行下面的命令进行安装,
18+
# python setup.py install
19+
# ubuntu 用户可能需要添加 sudo
20+
# 由于 python ecdsa 这个开发库仅支持 ec 格式的私钥,从腾讯云下载的私钥格式是
21+
# pk #8 的格式,需要使用 openssl 命令进行转换,或者使用我们工具包中的 openssl 进行转换
22+
# 下面是转换命令
23+
# openssl ec -outform PEM -inform PEM -in private.pem -out private_ec.pem
24+
# -in 后面的传入下载的私钥 -out 后面是转换后的私钥文件
25+
26+
from ecdsa import SigningKey,util
27+
import hashlib
28+
29+
# 这里请填写应用自己的私钥
30+
ecdsa_pri_key = """
31+
-----BEGIN EC PRIVATE KEY-----
32+
MHQCAQEEIEJDBDY4KVdj3dPBacADreB772ok45A57YWrUUvc5fMQoAcGBSuBBAAK
33+
oUQDQgAEaPVFHhWqRDnKnVlyU5JIzXOUyOJd/pPUwhLUovf+PYBm7otRBptnvJ4E
34+
oJ4qeSJNG0v4XdiqM3mtChkhUEFT3Q==
35+
-----END EC PRIVATE KEY-----
36+
"""
37+
38+
def base64_encode_url(data):
39+
base64_data = base64.b64encode(data)
40+
base64_data = base64_data.replace('+', '*')
41+
base64_data = base64_data.replace('/', '-')
42+
base64_data = base64_data.replace('=', '_')
43+
return base64_data
44+
45+
def base64_decode_url(base64_data):
46+
base64_data = base64_data.replace('*', '+')
47+
base64_data = base64_data.replace('-', '/')
48+
base64_data = base64_data.replace('_', '=')
49+
raw_data = base64.b64decode(base64_data)
50+
return raw_data
51+
52+
class TLSSigAPI:
53+
""""""
54+
__acctype = 0
55+
__identifier = ""
56+
__appid3rd = ""
57+
__sdkappid = 0
58+
__version = 20151204
59+
__expire = 3600*24*30 # 默认一个月,需要调整请自行修改
60+
__pri_key = ""
61+
__pub_key = ""
62+
_err_msg = "ok"
63+
64+
65+
def __get_pri_key(self):
66+
return self.__pri_key_loaded
67+
68+
def __init__(self, sdkappid, pri_key):
69+
self.__sdkappid = sdkappid
70+
self.__pri_key = pri_key
71+
self.__pri_key_loaded = SigningKey.from_pem(self.__pri_key)
72+
73+
def __create_dict(self):
74+
m = {}
75+
m["TLS.account_type"] = "%d" % self.__acctype
76+
m["TLS.identifier"] = "%s" % self.__identifier
77+
m["TLS.appid_at_3rd"] = "%s" % self.__appid3rd
78+
m["TLS.sdk_appid"] = "%d" % self.__sdkappid
79+
m["TLS.expire_after"] = "%d" % self.__expire
80+
m["TLS.version"] = "%d" % self.__version
81+
m["TLS.time"] = "%d" % time.time()
82+
return m
83+
84+
def __encode_to_fix_str(self, m):
85+
fix_str = "TLS.appid_at_3rd:"+m["TLS.appid_at_3rd"]+"\n" \
86+
+"TLS.account_type:"+m["TLS.account_type"]+"\n" \
87+
+"TLS.identifier:"+m["TLS.identifier"]+"\n" \
88+
+"TLS.sdk_appid:"+m["TLS.sdk_appid"]+"\n" \
89+
+"TLS.time:"+m["TLS.time"]+"\n" \
90+
+"TLS.expire_after:"+m["TLS.expire_after"]+"\n"
91+
return fix_str
92+
93+
def tls_gen_sig(self, identifier):
94+
self.__identifier = identifier
95+
m = self.__create_dict()
96+
fix_str = self.__encode_to_fix_str(m)
97+
pk_loaded = self.__get_pri_key()
98+
sig_field = pk_loaded.sign(fix_str, hashfunc=hashlib.sha256, sigencode=util.sigencode_der)
99+
sig_field_base64 = base64.b64encode(sig_field)
100+
m["TLS.sig"] = sig_field_base64
101+
json_str = json.dumps(m)
102+
sig_cmpressed = zlib.compress(json_str)
103+
base64_sig = base64_encode_url(sig_cmpressed)
104+
return base64_sig
105+
106+
def main():
107+
api = TLSSigAPI(1400001052, ecdsa_pri_key)
108+
sig = api.tls_gen_sig("xiaojun")
109+
print sig
110+
111+
if __name__ == "__main__":
112+
main()

__init__.py

Whitespace-only changes.

setup.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
from setuptools import setup, find_packages
2+
3+
setup (
4+
name='tls-sig-api',
5+
version='1.0',
6+
packages=find_packages(),
7+
8+
author_email='okhowang@tencent.com',
9+
10+
py_modules=[
11+
'TLSSigAPI'
12+
],
13+
install_requires=[
14+
'ecdsa',
15+
],
16+
17+
url='https://github.com/tencentyun/tls-sig-api-python',
18+
license='MIT',
19+
)

0 commit comments

Comments
 (0)