aliyun oss, 对象存储, ossutil

aliyun oss, 对象存储, ossutil aliyun oss, ossutil install ossutil sudo -v ; curl https://gosspublic.alicdn.com/ossutil/install.sh | sudo bash # 生成配置文件, stsToken 可以置空 ossutil config ./ossutil cp a -f oss://my-bucket/path ./ossutil64 cp /root/tmp/wordpress.sql -f oss://wiloon-backup/ https://help.aliyun.com/document_detail/50561.html?spm=a2c4g.11186623.6.1283.2e0655b7qtA1Md https://help.aliyun.com/document_detail/120075.html

2019-01-30 · 1 min · 35 words · -

procd

procd https://openwrt.org/docs/guide-developer/procd-init-scripts https://blog.csdn.net/liangdsing/article/details/53906445 #!/bin/sh /etc/rc.common # Copyright (C) 2008 OpenWrt.org #执行的顺序,按照字符串顺序排序并不是数字排序 START=98 #使用procd启动 USE_PROCD=1 #start_service 函数必须要重新定义 start_service() { #创建一个实例, 在procd看来一个应用程序可以多个实例 procd_open_instance #定义respawn参数,告知procd当binloader程序退出后尝试进行重启 procd_set_param respawn # binloader执行的命令是"/usr/bin/binloader", 若后面有参数可以直接在后面加上 procd_set_param command "$BINLOADER_BIN" #关闭实例 procd_close_instance } #stop_service重新定义,退出服务器后需要做的操作 stop_service() { rm -f /var/run/binloader.pid } restart() { stop start } start_service() 为注册服务到procd中,如果自己的应用程序没有配置文件,只要实现start_service()就好, procd_set_param设置设置好多参数,command为自己的应用路径, respawn可以检测自己的应用,如果挂掉可以重启,也可以设置重启间隔,其它参数可以自己查阅。 stop_service() 这个时procd kill自己的应用程序后调用的,若果你的应用程序关掉后,需要一些清理工作,需要实现这个。 service_triggers() 如果自己的应用需要关联一个配置文件test, (需要放在/etc/config/目录下) ,可以跟踪文件的修改情况,如果这个文件有改变,就调用reload_service().在service_triggers也可以添加跟踪网络的修改,也可以同时跟踪多个配置文件。 reload_service() 配置文件改变后,需要调用这个函数,可以根据自己需要实现功能。 注: start和reload区别是,start一般是指应用程序启动, reload一般是指只是重新加载与配置文件改变相关的部分,不把整个应用程序重新启动。这种方式应该是推荐的,如果你再reload里重新启动应用也是可以的。 ...

2019-01-28 · 1 min · 62 words · -

介词, Preposition, prep.

介词, Preposition, prep 介词(Preposition 简写prep.) 介词又被称作前置词,是表示名词、代词等与句中其他单词之间的关系的词汇,在句中不能单独作句子成分。 介词后面一般有名词、代词或相当于名词的其他词类、短语或从句作它的宾语,表示与其他成分的关系。介词和它的宾语构成介词词组,在句中作状语,表语,补语,定语或介词宾语。介词可以分为时间介词、地点介词、方式介词、原因介词、数量介词和其他介词。 介词一般用于名词或者代词前面,表示该词与句中其他成分的关系。介词后面的名词或代词称为介词宾语(如果是人称代词,则要用宾格)。介词和介词宾语合在一起构成介词短语。 PS:介词是一种虚词,不能单独作句子成分,只能用在一个名词、代词或相当于名词的结构之前,可以与后面的词一起构成介词短语。 简单介词 简单的介词包括:in,on,with,by,for,at,about,under,of 等。 合成介词 包括into,within,throughout,inside,outside,without等 重叠介词 from among 从…当中 from behind 从…后面, until after 直至…之后, at about 在大约…, after about 在大约…之后 等 短语介词 一个或两个简单介词和一个或几个其他词类构成一个短语,作用相当于一个介词,这就叫做短语介词。这类介词的末尾总是一个简单介词 如 according to,because of,by means of,in addition to,in front of, in spite of,into等。 分词介词 有极少数介词的词尾是“-ing”,形似现在分词(其中也有些可做分词)。 常用的有:considering,regarding,respecting,including。 按词义分 表示“地点(包括动向)”的有:about around(在…附近、周围),above(高于、在…斜上方),across(在…对面、横过)…… 主要用途 表示时间 1、表示在某时间.常用介词at,on,in等。 用 at 来表示在某一段时刻: at dawn/daybreak: 在黎明 at six :在6点钟 at midnight :在午夜 at 4:30 :在4点30分 用 at 来表示在……岁时 ...

2019-01-26 · 2 min · 373 words · -

Let's Encrypt 证书

Let’s Encrypt 证书 https://www.jianshu.com/p/c5c9d071e395 Let’s Encrypt

2019-01-26 · 1 min · 6 words · -

aliyun ddns

aliyun ddns https://github.com/honwen/aliyun-ddns-cli aliyun-ddns-cli --access-key-id=ak0 --access-key-secret=sk0 auto-update --domain=domain0.wiloon.com --redo=600 docker run -d \ -e "AKID=[ALIYUN's AccessKey-ID]" \ -e "AKSCT=[ALIYUN's AccessKey-Secret]" \ -e "DOMAIN=ddns.aliyun.win" \ -e "REDO=600" \ -e "TTL=600" \ chenhw2/aliyun-ddns-cli jeessy2/ddns-go https://github.com/jeessy2/ddns-go

2019-01-26 · 1 min · 33 words · -

owncloud,cozy, nextcloud, Cloudreve

owncloud,cozy, nextcloud, Cloudreve Cloudreve ☁️ 支持本机、从机、七牛、阿里云 OSS、腾讯云 COS、又拍云、OneDrive (包括世纪互联版) 作为存储端 📤 上传/下载 支持客户端直传,支持下载限速 💾 可对接 Aria2 离线下载,可使用多个从机节点分担下载任务 📚 在线 压缩/解压缩、多文件打包下载 💻 覆盖全部存储策略的 WebDAV 协议支持 ⚡ 拖拽上传、目录上传、流式上传处理 🗃️ 文件拖拽管理 👩‍👧‍👦 多用户、用户组 🔗 创建文件、目录的分享链接,可设定自动过期 👁️‍🗨️ 视频、图像、音频、文本、Office 文档在线预览 🎨 自定义配色、黑暗模式、PWA 应用、全站单页应用 🚀 All-In-One 打包,开箱即用 Gofi https://gofi.calmlyfish.com/zh/ nohup ./gofi-linux-amd64 & podman run -d --name=gofi -p 80:8080 -v gofi-app:/app sloaix/gofi:latest owncloud podman pull owncloud/ocis podman run –rm -ti -p 9200:9200 -e OCIS_INSECURE=true owncloud/ocis Cozy Cloud Cozy Cloud是一个开源的个人私有云,可以用于阅读电子邮件,或者管理和同步联系人、文件或日历,同时会有相关的应用商店和社区作为素材库,它可以将所有Web服务都放在同一个私有的个人平台,通过此平台,用户的网页应用和设备可以轻松地进行数据分享。 ...

2019-01-26 · 1 min · 137 words · -

Linux密码策略

Linux密码策略 authconfig --passminlen=8 --passmaxrepeat=3 --enablereqlower --enablerequpper --enablereqdigit --enablereqother --update 基于RHEL的系统 (RHEL CentOS Scientific) RHEL7,CentOS7,Scientific7 设置密码中至少包含一个小写字符,执行命令: authconfig -enablereqlower -update 查看设置: grep “^lcredit” /etc/security/pwquality.conf 设置密码中至少包含一个大写字符,执行命令: authconfig -enablerequpper -update 查看设置: grep “^ucredit” /etc/security/pwquality.conf 设置密码中至少包含一个数字字符,执行命令: authconfig -enablereqdigit -update 查看设置: grep “^dcredit” /etc/security/pwquality.conf 设置密码中至少包含一个特殊字符,执行命令: authconfig -enablereqother -update 查看设置: grep “^ocredit” /etc/security/pwquality.conf RHEL6,CentOS6,Scientific6 编辑 /etc/pam.d/system-auth 文件: vim /etc/pam.d/system-auth 找到如下一行,修改: password requisite pam_cracklib.so try_first_pass retry=3 type= minlen=8 dcredit=-1 ucredit=-1 lcredit=-1 ocredit=-1 上面配置了密码至少8个字符长,并且分别包含大小写字母、数字和特殊字符。 设置密码过期时间 我们设置如下策略: 一个密码使用的最长天数 更改密码最少天数间隔,为了不让用户频繁更改密码 在密码过期前多少天提醒用户

2019-01-25 · 1 min · 70 words · -

ansible inventory

ansible inventory ansible_user=root

2019-01-25 · 1 min · 3 words · -

golang file,文件操作

golang file,文件操作 文件大小 func main() { fi,err:=os.Stat("water") if err ==nil { fmt.Println("file size is ",fi.Size(),err) } } package main import ( "bufio" "fmt" "io" "io/ioutil" "os" ) func main() { dir := "/tmp/foo/bar" fileName := "file0.txt" writeTxtFile(dir, fileName, "foo") out := readTxtFile(dir, fileName) fmt.Println("read result: " + out) } func writeTxtFile0(dir, fileName, content string) { if !isExist(dir) { err := os.MkdirAll(dir, 0777) if err != nil { fmt.Printf("%s\n", err) } else { fmt.Println("Create Directory OK!") } } fullFileName := dir + string(os.PathSeparator) + fileName file, e := os.OpenFile(fullFileName, os.O_WRONLY|os.O_TRUNC|os.O_CREATE, 0777) if e != nil { fmt.Println("open file: " + e.Error()) } defer file.Close() n, err := file.WriteString(content) if err != nil { fmt.Println("write string: " + err.Error()) return } fmt.Printf("write length: %v\n", n) } func writeTxtFile(dir, fileName, content string) { if !isExist(dir) { err := os.MkdirAll(dir, 0777) if err != nil { fmt.Printf("%s\n", err) } else { fmt.Println("Create Directory OK!") } } err := ioutil.WriteFile(dir+string(os.PathSeparator)+fileName, []byte(content), 0777) if err != nil { fmt.Printf("failed to write file, file name: %v, err: %v", fileName, err) return } } // read txt file func readTxtFile(dir, fileName string) string { path := dir + string(os.PathSeparator) + fileName dat, err := ioutil.ReadFile(path) if err != nil { fmt.Println("failed to read file: " + fileName) } return string(dat) } func check(e error) { if e != nil { panic(e) } } func isExist(fileName string) bool { _, err := os.Stat(fileName) if err == nil { fmt.Println("file exist: " + fileName) return true } else if os.IsNotExist(err) { fmt.Println("file not exist") return false } else { fmt.Println("file error") } return false } 判断是文件还是目录 f, _ := os.Stat("a.txt") f.IsDir() move file func main() { oldLocation := "/var/www/html/test.txt" newLocation := "/var/www/html/src/test.txt" err := os.Rename(oldLocation, newLocation) if err != nil { log.Fatal(err) } } 判断文件是否存在 os.Stat(parentDir) // 创建目录 os.Mkdir(parentDir, os.ModePerm) 删除文件 file := "test.txt" err := os.Remove(file) package main import ( "fmt" "os" ) // 判断文件夹是否存在 func PathExists(path string) (bool, error) { _, err := os.Stat(path) if err == nil { return true, nil } if os.IsNotExist(err) { return false, nil } return false, err } func main() { _dir := "./gzFiles2" exist, err := PathExists(_dir) if err != nil { fmt.Printf("get dir error![%v]\n", err) return } if exist { fmt.Printf("has dir![%v]\n", _dir) } else { fmt.Printf("no dir![%v]\n", _dir) // 创建文件夹 err := os.Mkdir(_dir, os.ModePerm) if err != nil { fmt.Printf("mkdir failed![%v]\n", err) } else { fmt.Printf("mkdir success!\n") } } } 写文件 /***************************** 第一种方式: 使用 io.WriteString 写入文件***/ if checkFileIsExist(filename) { //如果文件存在 f, err1 = os.OpenFile(filename, os.O_APPEND, 0666) //打开文件 fmt.Println("文件存在") } else { f, err1 = os.Create(filename) //创建文件 fmt.Println("文件不存在") } check(err1) n, err1 := io.WriteString(f, wireteString) //写入文件(字符串) check(err1) fmt.Printf("写入 %d 个字节n", n) /***************************** 第二种方式: 使用 ioutil.WriteFile 写入文件****/ var d1 = []byte(wireteString) err2 := ioutil.WriteFile("./output2.txt", d1, 0666) //写入文件(字节数组) check(err2) /***************************** 第三种方式: 使用 File(Write,WriteString) 写入文件***/ f, err3 := os.Create("./output3.txt") //创建文件 check(err3) defer f.Close() n2, err3 := f.Write(d1) //写入文件(字节数组) check(err3) fmt.Printf("写入 %d 个字节n", n2) n3, err3 := f.WriteString("writesn") //写入文件(字节数组) fmt.Printf("写入 %d 个字节n", n3) f.Sync() /***************************** 第四种方式: 使用 bufio.NewWriter 写入文件****/ w := bufio.NewWriter(f) //创建新的 Writer 对象 n4, err3 := w.WriteString("bufferedn") fmt.Printf("写入 %d 个字节n", n4) w.Flush() f.Close() 一般文件比较小的话可以将文件全部读入内存中,然后转换成string再按行分割一下 func GetFileContentAsStringLines(filePath string) ([]string, error) { logger.Infof("get file content as lines: %v", filePath) result := []string{} b, err := ioutil.ReadFile(filePath) if err != nil { logger.Errorf("read file: %v error: %v", filePath, err) return result, err } s := string(b) for _, lineStr := range strings.Split(s, "\\n") { lineStr = strings.TrimSpace(lineStr) if lineStr == "" { continue } result = append(result, lineStr) } logger.Infof("get file content as lines: %v, size: %v", filePath, len(result)) return result, nil } Golang 超大文件读取的两个方案 第一个是使用流处理方式代码如下 func ReadFile(filePath string, handle func(string)) error { f, err := os.Open(filePath) defer f.Close() if err != nil { return err } buf := bufio.NewReader(f) for { line, err := buf.ReadLine("\n") line = strings.TrimSpace(line) handle(line) if err != nil { if err == io.EOF{ return nil } return err } return nil } } 第二个方案就是分片处理, 当读取的是二进制文件,没有换行符的时候,使用下面的方案处理大文件 func ReadBigFile(fileName string, handle func([]byte)) error { f, err := os.Open(fileName) if err != nil { fmt.Println("can't opened this file") return err } defer f.Close() s := make([]byte, 4096) for { switch nr, err := f.Read(s[:]); true { case nr < 0: fmt.Fprintf(os.Stderr, "cat: error reading: %s\n", err.Error()) os.Exit(1) case nr == 0: // EOF return nil case nr > 0: handle(s[0:nr]) } } return nil } https://learnku.com/articles/23559/two-schemes-for-reading-golang-super-large-files https://blog.csdn.net/xielingyun/article/details/50324423 https://blog.csdn.net/robertkun/article/details/78776585

2019-01-23 · 4 min · 716 words · -

WebDAV

WebDAV Web 分布式创作和版本管理 (WebDAV) 是 HTTP 协议的扩展,支持将 Web 服务器显示为标准的网络驱动器。WebDAV 客户端默认安装在大部分常见的操作系统上,可用于直接装载和访问 QNAP NAS 上的共享文件夹。WebDAV 访问具有以下好处: 256 位 AES SSL 加密 绕过防火墙和代理 速度比使用 VPN 的 Microsoft 网络连接 (SMB/CIFS) 更快 https://www.qnap.com/zh-cn/how-to/tutorial/article/%E5%A6%82%E4%BD%95%E9%80%8F%E8%BF%87-webdav-%E8%BF%9C%E7%A8%8B%E8%AE%BF%E9%97%AE%E6%82%A8%E7%9A%84-nas/ windows挂栽webdav # run in cmd net use * https://xxx.wiloon.com/remote.php/webdav/ Error 0x800700DF: The file size exceeds the limit allowed and cannot be saved. Regedit HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WebClient\Parameters image FileSizeLimitInBytes Set to the following Decimal: 4294967295 Click OK Restart the WebClient service Refresh the Windows Explorer WebDAV window ...

2019-01-22 · 1 min · 84 words · -

raspberry pi nfs server

raspberry pi nfs server #安装 NFS 服务器 sudo apt install nfs-kernel-server vim /etc/exports # 添加如下内容以允许所有可以访问 NAS 云盘的设备挂载存储: /nas/data *(rw,sync,no_subtree_check) # restart nfs server systemctl restart nfs-kernel-server # 在另一台linux 上挂载 sudo mkdir /nas/data sudo mount -t nfs <raspberry-pi-hostname-or-ip>:/nas/data /nas/data autofs pacman -S autofs pacman -S nfs-utils sudo systemctl start rpcbind sudo systemctl enable rpcbind sudo vim /etc/autofs/auto.master /nas /etc/autofs/auto.pi3bp --timeout 61 sudo vim /etc/autofs/auto.pi3bp data -rw,soft,intr,rsize=8192,wsize=8192 pi3bp:/nas/data sudo systemctl start autofs sudo systemctl enable autofs # 共享目录权限问题, 在服务端安装 acl sudo apt-get install acl setfacl -R -m u:1000:rwx /nas/data 共享目录权限问题 ...

2019-01-19 · 1 min · 116 words · -

ACL (Access Control List)

ACL (Access Control List) https://www.cnblogs.com/sparkdev/p/5536868.html ACL的全称是 Access Control List (访问控制列表) ,一个针对文件/目录的访问控制列表。它在UGO权限管理的基础上为文件系统提供一个额外的、更灵活的权限管理机制。它被设计为UNIX文件权限管理的一个补充。ACL允许你给任何的用户或用户组设置任何文件/目录的访问权限。 setfacl 命令可以用来细分linux下的文件权限。 chmod 命令可以把文件权限分为 u,g,o三个组, 而 setfacl可以对每一个文件或目录设置更精确的文件权限。 换句话说, setfacl 可以更精确的控制权限的分配。 比如: 让某一个用户对某一个文件具有某种权限。 这种独立于传统的u,g,o的rwx权限之外的具体权限设置叫ACL (Access Control List) ACL 可以针对单一用户、单一文件或目录来进行r,w,x的权限控制,对于需要特殊权限的使用状况有一定帮助。 如,某一个文件,不让单一的某个用户访问。 setfacl 参数 Usage: setfacl [-bkndRLP] { -m|-M|-x|-X … } file … -m, -modify=acl modify the current ACL(s) of file(s) -M, -modify-file=file read ACL entries to modify from file -x, -remove=acl remove entries from the ACL(s) of file(s) -X, -remove-file=file read ACL entries to remove from file ...

2019-01-19 · 2 min · 343 words · -

ss command

ss command ss, Socket Statistics ss -ntlp ss -ntp ss -nxlp ss -nxp sudo ss -tuln6 | grep ':53' ss 是 Socket Statistics 的缩写。ss 命令可以用来获取 socket 统计信息,它显示的内容和 netstat 类似。但 ss 的优势在于它能够显示更多更详细的有关 TCP 和连接状态的信息,而且比 netstat 更快。当服务器的 socket 连接数量变得非常大时,无论是使用 netstat 命令还是直接 cat /proc/net/tcp,执行速度都会很慢。ss 命令利用到了 TCP 协议栈中 tcp_diag。tcp_diag 是一个用于分析统计的模块,可以获得 Linux 内核中第一手的信息,因此 ss 命令的性能会好很多。 常用选项 -h, –help 帮助 -V, –version 显示版本号 -t, –tcp 显示 TCP 协议的 sockets -u, –udp 显示 UDP 协议的 sockets -x, –unix 显示 unix domain sockets,与 -f 选项相同 -n, –numeric 不解析服务的名称,如 “22” 端口不会显示成 “ssh” -l, –listening 只显示处于监听状态的端口 -p, –processes 显示监听端口的进程(Ubuntu 上需要 sudo) -a, –all 对 TCP 协议来说,既包含监听的端口,也包含建立的连接 -r, –resolve 把 IP 解释为域名,把端口号解释为协议名称 ...

2019-01-08 · 6 min · 1243 words · -

shell 状态代码

shell 状态代码 https://blog.csdn.net/hongkangwl/article/details/16184883 Linux提供 $? 特殊变量来保存最后一条命令执行结束的退出状态。执行完一条命令后,立即执行 echo $?, 可以查看最后一条命令的退出状态值。 正常的情况下,命令成功执行完成的退出状态是0,如果非0,则命令执行有错。 该命令可以用于检查命令是否正确执行,比如在解压包的时候,检查解压包是否成功十分有效。 自定义退出状态码,可以在脚本中定义自己的退出状态代码,然后使用 echo $? 检查。 退出状态码最高是255,一般自定义的代码值为0~255,如果超出255,则返回该数值被256除了之后的余数。 shell 退出状态代码 0 命令成功完成 1 通常的未知错误 2 误用 shell 命令 126 命令无法执行 127 没有找到命令 128 无效的退出参数 128+x 使用Linux信号x的致命错误。 130 使用Ctrl-C终止的命令 255 规范外的退出状态 作者: 王伴农 来源: CSDN 原文: https://blog.csdn.net/hongkangwl/article/details/16184883 版权声明: 本文为博主原创文章,转载请附上博文链接!

2019-01-07 · 1 min · 46 words · -

java Keytool

java Keytool keytool -list -v -keystore /usr/java/default/jre/lib/security/cacerts sudo /usr/lib/jvm/java-8-openjdk/bin/keytool -importcert -keystore /usr/lib/jvm/java-8-openjdk/jre/lib/security/cacerts -storepass changeit -noprompt -file xxx.crt -alias "xxx.crt" # jdk 导入 证书 keytool.exe -importcert -keystore "C:\Program Files\Java\jdk1.8.0_201\jre\lib\security\cacerts" -storepass changeit -noprompt -file E:\xxx.cer -alias "xxx" Keytool 是一个Java 数据证书的管理工具 ,Keytool 将密钥 (key) 和证书 (certificates) 存在一个称为keystore的文件中 在keystore里,包含两种数据: 密钥实体 (Key entity) ——密钥 (secret key) 又或者是私钥和配对公钥 (采用非对称加密) 可信任的证书实体 (trusted certificate entries) ——只包含公钥 ailas(别名)每个keystore都关联这一个独一无二的alias,这个alias通常不区分大小写 JDK中keytool 常用命令: param comments -genkey 在用户主目录中创建一个默认文件".keystore",还会产生一个mykey的别名,mykey中包含用户的公钥、私钥和证书 -alias 产生别名 -keystore 指定密钥库的名称(产生的各类信息将不在.keystore文件中) -keysize 指定密钥长度 -validity 指定创建的证书有效期多少天 -keyalg 指定密钥的算法 (如 RSA DSA (如果不指定默认采用DSA) ) -dname 指定证书拥有者信息 例如: “CN=名字与姓氏,OU=组织单位名称,O=组织名称,L=城市或区域名称,ST=州或省份名称,C=单位的两字母国家代码” -keypass 指定别名条目的密码(私钥的密码) -storepass 指定密钥库的密码(获取keystore信息所需的密码) -list 显示密钥库中的证书信息 -v 显示密钥库中的证书详细信息 -export 将别名指定的证书导出到文件 -printcert 查看导出的证书信息 -file 参数指定导出到文件的文件名 -import 将已签名数字证书导入密钥库, keytool -import -alias 指定导入条目的别名 -keystore 指定keystore -file 需导入的证书

2019-01-06 · 1 min · 108 words · -

SSL/TLS 握手过程

SSL/TLS 握手过程 Client Hello 握手第一步是客户端向服务端发送 Client Hello 消息,这个消息里包含了一个客户端生成的随机数 Random1、客户端支持的加密套件 (Support Ciphers) 和 SSL Version 等信息。通过 Wireshark 抓包,我们可以看到如下信息: Wireshark 抓包的用法可以参考这篇文章: https://segmentfault.com/a/1190000018746027 Server Hello 第二步是服务端向客户端发送 Server Hello 消息,这个消息会从 Client Hello 传过来的 Support Ciphers 里确定一份加密套件,这个套件决定了后续加密和生成摘要时具体使用哪些算法,另外还会生成一份随机数 Random2。注意,至此客户端和服务端都拥有了两个随机数 (Random1+ Random2) ,这两个随机数会在后续生成对称秘钥时用到。 Certificate 这一步是服务端将自己的证书下发给客户端,让客户端验证自己的身份,客户端验证通过后取出证书中的公钥。 Server Key Exchange 如果是DH算法,这里发送服务器使用的DH参数。RSA算法不需要这一步。 Certificate Request Certificate Request 是服务端要求客户端上报证书,这一步是可选的,对于安全性要求高的场景会用到。 Server Hello Done Server Hello Done 通知客户端 Server Hello 过程结束。 Certificate Verify 客户端收到服务端传来的证书后,先从 CA 验证该证书的合法性,验证通过后取出证书中的服务端公钥,再生成一个随机数 Random3,再用服务端公钥非对称加密 Random3 生成 PreMaster Key。 Client Key Exchange 上面客户端根据服务器传来的公钥生成了 PreMaster Key,Client Key Exchange 就是将这个 key 传给服务端,服务端再用自己的私钥解出这个 PreMaster Key 得到客户端生成的 Random3。至此,客户端和服务端都拥有 Random1 + Random2 + Random3,两边再根据同样的算法就可以生成一份秘钥,握手结束后的应用层数据都是使用这个秘钥进行对称加密。为什么要使用三个随机数呢?这是因为 SSL/TLS 握手过程的数据都是明文传输的,并且多个随机数种子来生成秘钥不容易被暴力破解出来。客户端将 PreMaster Key 传给服务端的过程如下图所示: ...

2019-01-06 · 1 min · 193 words · -

数字签名、数字证书与 PKI 系统

数字签名、数字证书与 PKI 系统 https://www.jianshu.com/p/ffe8c203a471 摘要算法 除了加密算法,摘要算法在互联网安全体系中也扮演了重要的角色。摘要算法有以下特性: 只要源文本不同,计算得到的结果,必然不同 (或者说机会很少) 。 无法从结果反推出源数据。 基于以上特性,我们一般使用摘要算法来校验原始内容是否被篡改。常见的摘要算法有 MD5、SHA 等。 Tips: 摘要算法不能算作加密算法,加密算法需要使用秘钥加解密,但摘要算法无法根据结果反推出内容。另外 MD5 目前也不算安全了,例如彩虹表攻击。 数字证书 数字证书是一个经证书授权中心数字签名的包含公开密钥拥有者信息以及公开密钥的文件。 数字证书里一般会包含公钥、公钥拥有者名称、CA 的数字签名、有效期、授权中心名称、证书序列号等信息。 数字证书如何确保列出的用户就是公钥的拥有者呢?关键点是 CA 的数字签名,CA会用自己的私钥将证书内容的摘要进行加密。因为 CA 的公钥是公开的,任何人都可以用公钥解密出 CA 的数字签名的摘要,再用同样的摘要算法提取出证书的摘要和解密 CA 数字签名后的摘要比对,一致则说明这个证书没有被篡改过,可以信任。 http://blog.wiloon.com/?p=3655 PKI PKI (Public Key Infrastructure) 翻译过来就是公钥基础设施,可以理解为利用公钥技术为网络应用提供加密和数字签名等密码服务以及必需的密钥和证书管理体系。它是一个提供安全服务的基础设施,PKI 技术是信息安全技术的核心,同时也是电子商务的关键和基础技术。 PKI 既不是一个协议,也不是一个软件,它是一个标准,在这个标准之下发展出的为了实现安全基础服务目的的技术统称为 PKI。 PKI是一个标准,它包括一些基本的组件,不同的组件提供不同的服务,主要由一下几个组件组成: 认证中心 CA(证书签发): CA 机构,又称为证书授证 (Certificate Authority) 中心,是 PKI 的"核心",即数字证书的申请及签发机关,CA 必须具备权威性的特征,它负责管理 PKI 结构下的所有用户(包括各种应用程序)的证书,把用户的公钥和用户的其他信息捆绑在一起,在网上验证用户的身份,CA 还要负责用户证书的黑名单登记和黑名单发布。 X.500目录服务器(证书保存): X.500目录服务器用于"发布"用户的证书和黑名单信息,用户可通过标准的 LDAP 协议查询自己或其他人的证书和下载黑名单信息。 具有高强度密码算法(SSL)的安全 WWW 服务器(即配置了 HTTPS 的apache): Secure socket layer(SSL)协议最初由 Netscape 企业发展,现已成为网络用来鉴别网站和网页浏览者身份,以及在浏览器使用者及网页服务器之间进行加密通讯的全球化标准。 Web(安全通信平台): Web 有 Web Client 端和 Web Server 端两部分,分别安装在客户端和服务器端,通过具有高强度密码算法的 SSL 协议保证客户端和服务器端数据的机密性、完整性、身份验证。 ...

2019-01-06 · 1 min · 82 words · -

golang tcp tls

golang tcp tls https://colobu.com/2016/06/07/simple-golang-tls-examples/ 生成TLS证书 http://blog.wiloon.com/?p=12962 server package main import ( "bufio" "crypto/tls" "log" "net" ) func main() { cert, err := tls.LoadX509KeyPair("certs/server.pem", "certs/server.key") if err != nil { log.Println(err) return } config := &tls.Config{Certificates: []tls.Certificate{cert}} address := ":8443" log.Println("listening: ", address) ln, err := tls.Listen("tcp", address, config) if err != nil { log.Println(err) return } defer ln.Close() for { conn, err := ln.Accept() if err != nil { log.Println(err) continue } go handleConn(conn) } } func handleConn(conn net.Conn) { defer conn.Close() r := bufio.NewReader(conn) for { msg, err := r.ReadString('\n') if err != nil { log.Println(err) return } println(msg) n, err := conn.Write([]byte("world\n")) if err != nil { log.Println(n, err) return } } } client package main import ( "crypto/tls" "log" ) func main() { conf := &tls.Config{ InsecureSkipVerify: true, } conn, err := tls.Dial("tcp", "127.0.0.1:8443", conf) if err != nil { log.Println(err) return } defer conn.Close() n, err := conn.Write([]byte("hello\n")) if err != nil { log.Println(n, err) return } buf := make([]byte, 100) n, err = conn.Read(buf) if err != nil { log.Println(n, err) return } println(string(buf[:n])) }

2019-01-05 · 1 min · 180 words · -

newifi 3

newifi 3 newifi 3 处理器 MT7621A, mipsle 32M的ROM 512M的RAM 1个USB3.0接口 双频无线 一个千兆WAN口、 4个千兆LAN口 https://www.right.com.cn/forum/forum.php?mod=viewthread&tid=341067&highlight=newifi%2Bd2%2Bopenwrt https://github.com/coolsnowwolf/lede https://downloads.openwrt.org/releases/18.06.1/targets/ramips/mt7621/

2019-01-03 · 1 min · 16 words · -

kde lock screen

kde lock screen shortcut Go to “System Settings” (KDE menu). Workspace>Workspace Behavior>Screen Locking>Activation>Keyboard shortcut config https://askubuntu.com/questions/783184/how-to-display-kde-lock-screen-time-in-24-hour-format

2019-01-03 · 1 min · 16 words · -