当前位置: 首页 > news >正文

免费个人网站怎么建立深圳网站建设制作厂家

免费个人网站怎么建立,深圳网站建设制作厂家,c 网站开发案例源码,如何做内网网站SSL/TLS协议 SSL#xff0c;Secure Socket Layer#xff0c;安全套接层 TLS#xff0c;Transport Layer Security#xff0c;传输层安全协议 TLS是SSL的最终完善版本#xff0c;一般也可称为SSL协议 SSL是负责传输层安全#xff0c;确定传输层数据如何封装的一套协议…SSL/TLS协议 SSLSecure Socket Layer安全套接层 TLSTransport Layer Security传输层安全协议 TLS是SSL的最终完善版本一般也可称为SSL协议 SSL是负责传输层安全确定传输层数据如何封装的一套协议 SSL协议阶段 算法协商数字证书验证数据通信 SSL协议核心内容 事先准备 服务端生成自己的私钥和公钥 服务端向CA机构申请SSL证书 CA向服务器颁发数字证书该证书通过CA私钥加密包含了服务端域名和公钥用于证明服务端身份 算法协商阶段 客户端和服务端分别生成随机数RNC和RNS连同SSL算法参数一起发送给对方 数字证书验证阶段 服务端将自己的数据进行摘要再通过私钥加密生成数字签名 服务端将数据数字签名数字证书一同发往客户端 客户端通过CA公钥解密数字证书确认证书与域名一致后拿到服务端公钥保证了公钥未被篡改 客户端通过服务端公钥解开数字签名得到数据摘要保证了数据来自服务端 客户端对数据部分进行摘要与数字签名中的摘要进行对比保证了数据完整性 客户端生成随机数PMSPre Master Secret通过服务端公钥加密发给服务端 服务端通过私钥解密出PMS 双方根据RNCRNSPMS构建主密钥MSMaster Secret完成对称秘钥协商 数据通信阶段 服务端和客户端通过主密钥MS加密解密通信数据 双向认证 如果服务端也要求客户端持有SSL证书则增加一步服务端验证客户端证书的过程 秘钥协商算法 以上流程使用的是DH秘钥协商算法 如果用的是RSA算法则直接将PMS作为MS使用并且由客户端发送给服务端 SSL协议应用 最常见的是应用于Https协议此外也可应用于Socket和WebSocket SSL核心类 KeyManager用于管理自己的私钥和证书多用于服务端TrustManager用于验证收到的证书是否可信多用于客户端服务端也可以要求客户端也发送安全证书即双向认证此时双方都要同时设置KeyManagerTrustManagerKeyStore秘钥仓库用来存储私钥、公钥、证书等数据可设置密码TrustStoreKeyStore的一种存储CA证书用于验证服务端身份正确性密码公开KeyStore和TrustStore的区别仅在于存储的内容不同它们可以是同一个文件但是不建议这么做Java中比较常见的KeyStore文件格式是JKS此外还有CRT、PEM、P12、KEY等格式私钥和证书也可能分开保存KeyManagerFactory用于创建KeyManager一般通过algorithm和keystore文件来初始化TrustManagerFactory用于创建TrustManager一般通过algorithm和keystore文件来初始化SSLContext用于整体管理SSL相关事务一般通过KeyManager和TrustManager来初始化当KeyManager和TrustManager未指定时SSLContext会从系统已安装的SecurityProvider中搜索合适的Provider来处理对应工作SSLServerSocketFactory用于创建带SSL功能的ServerSocket可通过SSLContext创建SSLSocketFactory用于创建带SSL功能的ClientSocket可通过SSLContext创建也可以不使用Factory和KeyStore通过自定义的方式来创建KeyManager和TrustManagerSSLSessionContext维护所有会话信息可通过SSLContext.getSessionContext获得SSLSession可通过SSLSessionContext或SSLSocket来获得SSLServerSocket可以接收来自多个客户端的连接SSLSocket只能连接指定的服务器和端口SSLEngine用于实现SSL握手通过SSLContext创建一般不用自己去实现属于偏内部的Class 通过KeyTool生成KeyStore 学习SSL首先得有用于测试的SSL证书库所以我们先来看看如何生成KeyStore private.keystore和public.truststore本质上都是JKS文件只是为了区分作用而换了后缀 # 生成私钥证书首个名称请输入域名或ip keytool -genkeypair -alias alias -keyalg RSA -validity 365 -keystore private.keystore# 生成公钥证书 keytool -export -alias alias -keystore private.keystore -rfc -file public.cer# 公钥证书转为JKS格式 keytool -import -alias alias -file public.cer -keystore public.truststoreKeyStore格式转换 JKS是Java专用的秘钥仓库格式 不同平台和语言的对KeyStore的支持性和使用习惯并不一样 比如安卓就不支持JKS格式安卓上的证书一般使用P12格式 我们可以通过KeyStore Explorer软件来转换 https://keystore-explorer.org/downloads.html使用带SSL的TcpSocket import java.io.* import java.security.KeyStore import javax.net.ssl.KeyManagerFactory import javax.net.ssl.SSLContext import javax.net.ssl.SSLServerSocket import javax.net.ssl.SSLSocket import javax.net.ssl.TrustManagerFactoryconst val serverKeyStore resources/private.keystore const val clientKeyStore resources/public.truststore const val passphrase 123456const val serverPort 18001fun main() {Thread(::launchServerSocket).start()Thread.sleep(500)Thread(::launchClientSocket).start() }fun launchServerSocket() {// load key manager from key storeval keyManagerFactory KeyManagerFactory.getInstance(SunX509)val keyStore KeyStore.getInstance(JKS)keyStore.load(FileInputStream(serverKeyStore), passphrase.toCharArray())keyManagerFactory.init(keyStore, passphrase.toCharArray())val keyManagers keyManagerFactory.keyManagers// init ssl contextval context SSLContext.getInstance(TLS)context.init(keyManagers, null, null)// create server socketval serverSocketFactory context.serverSocketFactoryval serverSocket serverSocketFactory.createServerSocket(serverPort) as SSLServerSocketserverSocket.needClientAuth false// accept client sessionval socket serverSocket.accept() as SSLSocket// communication with clientwhile (true) {Thread.sleep(500)socket.getOutputStream().write(Hello World.encodeToByteArray())socket.getOutputStream().flush()} }fun launchClientSocket() {// load trust manager from trust storeval trustManagerFactory TrustManagerFactory.getInstance(SunX509)val trustStore KeyStore.getInstance(JKS)trustStore.load(FileInputStream(clientKeyStore), passphrase.toCharArray())trustManagerFactory.init(trustStore)val trustManagers trustManagerFactory.trustManagers// init ssl contextval context SSLContext.getInstance(TLS)context.init(null, trustManagers, null)// create client socket and auto connectval sslSocketFactory context.socketFactoryval socket sslSocketFactory.createSocket(localhost, serverPort) as SSLSocket// communication with serverval buffer ByteArray(1024)while (true) {val len socket.getInputStream().read(buffer)if (len 0) {val message String(buffer, 0, len)println(Client Received: $message)}} }使用带SSL的HttpServer 大多网络编程框架都是默认支持Https协议的但仅限于由CA机构颁发的可信任证书 对于人工签发未经CA机构授权的自签名证书必须由开发者自己去实现验证逻辑 import com.sun.net.httpserver.HttpsConfigurator import com.sun.net.httpserver.HttpsServer import java.io.* import java.net.InetSocketAddress import java.net.URI import java.net.http.HttpClient import java.net.http.HttpRequest import java.net.http.HttpResponse import java.security.KeyStore import java.util.* import javax.net.ssl.KeyManagerFactory import javax.net.ssl.SSLContext import javax.net.ssl.TrustManagerFactoryconst val serverKeyStore resources/private.keystore const val clientKeyStore resources/public.truststore const val passphrase 123456const val serverPort 18001fun main() {Thread(::launchHttpServer).start()Thread.sleep(1500)Thread(::launchHttpClient).start() }fun launchHttpServer() {// load key manager from key storeval keyManagerFactory KeyManagerFactory.getInstance(SunX509)val keyStore KeyStore.getInstance(JKS)keyStore.load(FileInputStream(serverKeyStore), passphrase.toCharArray())keyManagerFactory.init(keyStore, passphrase.toCharArray())val keyManagers keyManagerFactory.keyManagers// configure ssl contextval context SSLContext.getInstance(TLS)context.init(keyManagers, null, null)// create https serverval server HttpsServer.create(InetSocketAddress(serverPort), 10)// configure httpsval configurator HttpsConfigurator(context)server.httpsConfigurator configurator// create serviceserver.createContext(/home) { exchange -val response Date().toString().encodeToByteArray()exchange.sendResponseHeaders(200, response.size.toLong())exchange.responseBody.write(response)exchange.responseBody.close()}// start https serverserver.start() }fun launchHttpClient() {// load trust manager from trust storeval trustManagerFactory TrustManagerFactory.getInstance(SunX509)val trustStore KeyStore.getInstance(JKS)trustStore.load(FileInputStream(clientKeyStore), passphrase.toCharArray())trustManagerFactory.init(trustStore)val trustManagers trustManagerFactory.trustManagers// init ssl contextval context SSLContext.getInstance(TLS)context.init(null, trustManagers, null)// create http clientval uri URI.create(https://localhost:18001/home)val client HttpClient.newBuilder().version(HttpClient.Version.HTTP_1_1).sslContext(context).build()// send requestval request HttpRequest.newBuilder().GET().uri(uri).build()// get responseval response client.send(request, HttpResponse.BodyHandlers.ofString())println(response.body()) }使用带SSL的WebSocket 这里我们使用比较出名的Java-WebSocket库来实现WebSocket服务端和客户端功能 api(org.java-websocket:Java-WebSocket:1.5.1)为WebSocketServer设置SSL fun setServerSSL(server: WebSocketServer) {// load key manager from key storeval keyManagerFactory KeyManagerFactory.getInstance(SunX509)val keyStore KeyStore.getInstance(JKS)keyStore.load(FileInputStream(serverKeyStore), passphrase.toCharArray())keyManagerFactory.init(keyStore, passphrase.toCharArray())val keyManagers keyManagerFactory.keyManagers// configure ssl contextval context SSLContext.getInstance(TLS)context.init(keyManagers, null, null)// configure server sslval websocketServerFactory DefaultSSLWebSocketServerFactory(context)server.setWebSocketFactory(websocketServerFactory) }为WebSocketClient设置SSL fun setClientSSL(client: WebSocketClient) {// load trust manager from trust storeval trustManagerFactory TrustManagerFactory.getInstance(SunX509)val trustStore KeyStore.getInstance(JKS)trustStore.load(FileInputStream(clientKeyStore), passphrase.toCharArray())trustManagerFactory.init(trustStore)val trustManagers trustManagerFactory.trustManagers// configure ssl contextval context SSLContext.getInstance(TLS)context.init(null, trustManagers, null)// configure client sslval sslSocketFactory context.socketFactoryclient.setSocketFactory(sslSocketFactory) }在OkHttp中自定义KeyManager和TrustManager 以上案例都是通过KeyStore来实现KeyManager和TrustManager的管理功能 现在我们不用KeyStore通过自定义规则来实现秘钥管理和证书验证功能 我们以OkHttp框架为例 import okhttp3.OkHttpClient import java.security.cert.X509Certificate import javax.net.ssl.HostnameVerifier import javax.net.ssl.SSLContext import javax.net.ssl.SSLSession import javax.net.ssl.X509TrustManagerfun setOkHttpSSL(builder: OkHttpClient.Builder) {val trustManager object : X509TrustManager {override fun checkClientTrusted(chain: Arrayout X509Certificate, authType: String) {}override fun checkServerTrusted(chain: Arrayout X509Certificate, authType: String) {}override fun getAcceptedIssuers(): ArrayX509Certificate emptyArray()}val trustManagers arrayOf(trustManager)val hostnameVerifier HostnameVerifier { hostname: String, session: SSLSession - true }val sslContext SSLContext.getInstance(SSL)sslContext.init(null, trustManagers, null)val socketFactory sslContext.socketFactorybuilder.sslSocketFactory(socketFactory, trustManager)builder.hostnameVerifier(hostnameVerifier) }现在我们用OkHttp来替换上面的HttpClient来访问服务器 fun launchHttpClient() {val url https://localhost:18001/home// create okhttp clientval builder OkHttpClient.Builder()setOkHttpSSL(builder)val client builder.build()// create requestval request Request.Builder().url(url).get().build()// execute callval call client.newCall(request)val response call.execute()// print responseval responseBody response.body.string()println(responseBody) }这里我们为了演示不让问题复杂化只是简单地信任了所有的证书并不能起到实际的安全作用 关于KeyManagerTrustManagerHostnameVerifier的正式用法可以参考以下类的源码 SunX509KeyManagerImpl X509TrustManagerImpl OkHostnameVerifier SSL证书格式 JKS二进制格式存储Java专属格式 一般为私钥证书密码或只有公钥的组合 常用于Tomcat服务器 PEM文本格式存储 可保存私钥和证书一般以BEGIN开头END结尾中间为BASE64编码字符串 常用于Apache或Nginx服务器 CER/DER二进制格式存储 只能保存证书 常用于Windows服务器 CRT只是一个后缀名可以是PEM编码也可以是CER编码 一般只用来保存证书不存储私钥 可以将私钥单独保存以KEY作为后缀来区分秘钥文件和证书文件 KEY文件可以是PEM编码也可以是CER编码 P12/PKCS12/PFX二进制格式存储 一般同时包含私钥和证书有密码保护 常用于Windows IIS服务器 CSR证书请求文件 这个不是证书而是通过私钥向CA申请公钥的请求文件 最后要注意的是文件后缀和证书格式之间没有必然关系还是以文件内容的实际存储格式为准 SSL证书转换工具 OpenSSLKeyToolKeyStore Explorer OpenSSL指令 genrsa生成秘钥req创建自签名根证书或生成证书请求文件x509查看创建或转换证书-in输入文件-out输出文件-inform输入文件格式-outform输出文件格式-CA指定根证书-CAkey指定根证书私钥-CAserial指定CA证书-CAcreateserial创建下级CA证书 OpenSSL制作证书 # 创建根证书 openssl req -new -x509 -days 365 -extensions v3_ca -keyout crt/ca.key -out crt/ca.crt# 颁发服务端证书 openssl genrsa -out crt/server.key 2048 openssl req -out crt/server.csr -key crt/server.key -new openssl x509 -req -in crt/server.csr -CA crt/ca.crt -CAkey crt/ca.key -CAcreateserial -out crt/server.crt -days 365# 颁发客户端证书 openssl genrsa -out crt/client.key 2048 openssl req -out crt/client.csr -key crt/client.key -new openssl x509 -req -in crt/client.csr -CA crt/ca.crt -CAkey crt/ca.key -CAcreateserial -out crt/client.crt -days 365# 查看服务端证书 openssl x509 -in crt/server.crt -text -nooutEnd 到此为止基本涵盖了Java SSL的所有核心内容已经足以满足大家日常开发需要 更高阶的用法可能在专业的领域才能用得到希望大家遇到时能勇于自己去研究
http://www.pierceye.com/news/845128/

相关文章:

  • 自己做网站的各种代码wordpress只能访问主页
  • 四川监理协会建设网站长沙有哪些楼盘
  • 网站首页欣赏网站模板 wordpress带会员系统
  • 关于音乐的个人网站wordpress 报名表单
  • 国内做的好看的网站设计wordpress 与现有sso
  • 通辽网站建设罗湖中心区做网站
  • 宁波网站建设哪家快湛江专业的建站托管
  • 四川省城乡住房建设部网站首页自建wordpress 客户端
  • 番禺做网站价格百度app打开
  • 扬中网站推广导流非国产手机浏览器
  • 外国网站英语要求建立网站就是制作网页
  • 电商网站建设与运营实训可以做网站的app
  • 深圳南山区网站建设公司站长工具seo综合查询 分析
  • 互粉的网站是怎么做的网站建设公司利润怎么样
  • 个人网站平台搭建咸阳企业做网站
  • 租用外国服务器网站网站建设电子商务论文选题方向
  • 网站建设那种语言好wordpress 首页添加链接
  • NET开发网站开发工程师招聘潍坊市网站建设公司
  • 自己开发网站怎么盈利开发游戏需要多少资金
  • 先域名 还是先做网站塘厦
  • 企业公众号以及网站建设wordpress 代码块样式
  • 网站源码搭建教程大同建设银行保安招聘网站
  • 无锡网站设wordpress营销模板
  • 建站哪个好一点wordpress直达按钮
  • 卢松松网站的百度广告怎么做的小程序开发成都公司
  • 导航网站头部代码android开发者官网
  • 网站设计需求分析报告做漫画的网站有哪些
  • 做什么网站吸引人sinaapp wordpress 固定链接
  • 东莞做网站怎么样搜狐综合小时报2022113011
  • 校园网站的意义融资渠道