Browse Source

Echo sample now includes working TLS server.

Tim Burks 9 years ago
parent
commit
7438d2012d

+ 4 - 0
Examples/Echo/Swift/Echo.xcodeproj/project.pbxproj

@@ -12,6 +12,7 @@
 		D35C9FAE1D74B079000443CD /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = D35C9FAD1D74B079000443CD /* Assets.xcassets */; };
 		D35C9FB11D74B079000443CD /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = D35C9FAF1D74B079000443CD /* MainMenu.xib */; };
 		D35C9FC81D74B0C1000443CD /* EchoViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D35C9FC71D74B0C1000443CD /* EchoViewController.swift */; };
+		D3971E211D89132E001A0B3F /* ssl.key in Resources */ = {isa = PBXBuildFile; fileRef = D3971E201D89132E001A0B3F /* ssl.key */; };
 		D3BFE28C1D87A45D00A648D8 /* ssl.crt in Resources */ = {isa = PBXBuildFile; fileRef = D3BFE28B1D87A45D00A648D8 /* ssl.crt */; };
 		D3D2EA381D75FB4A002EF89C /* echo.out in Resources */ = {isa = PBXBuildFile; fileRef = D3D2EA371D75FB4A002EF89C /* echo.out */; };
 		D3D2EA4C1D75FB7F002EF89C /* gRPC.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D3D2EA3E1D75FB56002EF89C /* gRPC.framework */; };
@@ -71,6 +72,7 @@
 		D35C9FB01D74B079000443CD /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = "<group>"; };
 		D35C9FB21D74B079000443CD /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
 		D35C9FC71D74B0C1000443CD /* EchoViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EchoViewController.swift; sourceTree = "<group>"; };
+		D3971E201D89132E001A0B3F /* ssl.key */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = ssl.key; sourceTree = "<group>"; };
 		D3BFE28B1D87A45D00A648D8 /* ssl.crt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = ssl.crt; sourceTree = "<group>"; };
 		D3D2EA371D75FB4A002EF89C /* echo.out */ = {isa = PBXFileReference; lastKnownFileType = file; path = echo.out; sourceTree = "<group>"; };
 		D3D2EA391D75FB56002EF89C /* gRPC.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = gRPC.xcodeproj; path = ../../../gRPC.xcodeproj; sourceTree = "<group>"; };
@@ -113,6 +115,7 @@
 			isa = PBXGroup;
 			children = (
 				D3BFE28B1D87A45D00A648D8 /* ssl.crt */,
+				D3971E201D89132E001A0B3F /* ssl.key */,
 				D35C9FAB1D74B079000443CD /* AppDelegate.swift */,
 				D35C9FAD1D74B079000443CD /* Assets.xcassets */,
 				D35C9FAF1D74B079000443CD /* MainMenu.xib */,
@@ -247,6 +250,7 @@
 				D3BFE28C1D87A45D00A648D8 /* ssl.crt in Resources */,
 				D3D2EA381D75FB4A002EF89C /* echo.out in Resources */,
 				D35C9FAE1D74B079000443CD /* Assets.xcassets in Resources */,
+				D3971E211D89132E001A0B3F /* ssl.key in Resources */,
 				D35C9FB11D74B079000443CD /* MainMenu.xib in Resources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;

+ 7 - 3
Examples/Echo/Swift/Echo/AppDelegate.swift

@@ -37,10 +37,14 @@ class AppDelegate: NSObject, NSApplicationDelegate {
 
   @IBOutlet weak var window: NSWindow!
 
-  var echoServer: EchoServer!
+  var insecureEchoServer: EchoServer!
+  var secureEchoServer: EchoServer!
 
   func applicationDidFinishLaunching(_ aNotification: Notification) {
-    self.echoServer = EchoServer(address:"localhost:8081")
-    echoServer.start()
+    insecureEchoServer = EchoServer(address:"localhost:8081", secure:false)
+    insecureEchoServer.start()
+
+    secureEchoServer = EchoServer(address:"localhost:8443", secure:true)
+    secureEchoServer.start()
   }
 }

+ 44 - 12
Examples/Echo/Swift/Echo/EchoServer.swift

@@ -1,21 +1,55 @@
-//
-//  EchoServer.swift
-//  Echo
-//
-//  Created by Tim Burks on 9/8/16.
-//  Copyright © 2016 Google. All rights reserved.
-//
-
+/*
+ *
+ * Copyright 2016, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
 import Foundation
 import gRPC
 import QuickProto
 
 class EchoServer {
   private var address: String
+  private var server: Server
 
-  init(address:String) {
+  init(address:String, secure:Bool) {
     gRPC.initialize()
     self.address = address
+    if secure {
+      let certificateURL = Bundle.main.url(forResource: "ssl", withExtension: "crt")!
+      let certificate = try! String(contentsOf: certificateURL)
+      let keyURL = Bundle.main.url(forResource: "ssl", withExtension: "key")!
+      let key = try! String(contentsOf: keyURL)
+      self.server = gRPC.Server(address:address, key:key, certs:certificate)
+    } else {
+      self.server = gRPC.Server(address:address)
+    }
   }
 
   func start() {
@@ -23,9 +57,7 @@ class EchoServer {
     print("Server Starting")
     print("GRPC version " + gRPC.version())
 
-    let server = gRPC.Server(address:address)
-
-    server.run {(requestHandler) in
+     server.run {(requestHandler) in
       print("Received request to " + requestHandler.host()
         + " calling " + requestHandler.method()
         + " from " + requestHandler.caller())

+ 27 - 0
Examples/Echo/Swift/Echo/ssl.key

@@ -0,0 +1,27 @@
+-----BEGIN RSA PRIVATE KEY-----
+MIIEowIBAAKCAQEAu2KXnItyilAByNapgqAlkOrLP7bcr4FJEuZH5LEu5yGkUT/s
+wcZxKtuvLS5u5hU12gr27D9MbS7mSdBMFbayrWOf615vagf+D/ReTnPCvsn/4T+s
+Qn3qdnSgIZJ56dGFpLjk0aeEQX3kctUZxGEC8tUgkoP5W42zZvcEQR3EPyJr5plz
+zkw6t5ZEOQidi6xk0S7rNI2B6KoN78JoCJQr2JoYyrua1tjHB8OCHF+IXmXHhMOj
+fVgx1s0aqTdRBeYVUUrt9pKgjbnNE8W1E+ur0GkCkBhWEf+VoMq6BzpUe5H5L7lF
+JTaHkORvrlqtuzMhM610ecQnXTUconCkHdPPWwIDAQABAoIBADlxHbzVWoVfxUxF
+0azDXwCvmSKs8bWzUi1C/mLylcgwnehySieUp3hV47tb8o8BjYKLvenp9Ym6yMlz
+2v8FBHz2fz1ts4WzcYR+irJN9jL6RUBNfobbhpZNZhEkj87HdcprC2nhij9xUiiJ
+ft6eRoMeJmADqNsR8x7rNhioAVLAufORDGa5ThpaLTe53C7gzMcHerxBT7ZRCKqS
+J8EfxYHRF5k4VM0x2Xyo2DCIvoSP+ydcKiyuHQMAIbLt0GVZ+jOUQ/JJh+PNXGm6
+HJnv6O4+WB+O+D6TzxXkjeo8MBKyJCHHxTUCRMkU6ltPihvEzuGD+9M+amz5SK4G
+gxfxOyECgYEA6f93N5ASd2OE/cMNBSbsImZWFwfjcNrDX9V5QfoJ4zXPE7/e2PO/
+tfNrW7rm35RkygRzI/s7vVHoUuA6nGkeHOXUrOwiBybMk+PAflEwwdQNtXt4BJTZ
+mRIskcQGnJAITjw1zc8o9/V0tOZNOpbVeCR56ucHwxA+215CO4Y4jekCgYEAzQEd
+swh0kpRP+X8Xwfnnb0yXt4HCWsM4OHetz79JcOhv0LENj7zwJ3L3k0MOMZpkFKz/
+ty7SS/u3lgY1hVkJUggjw57Y9ZdIJvopx/myCLgXOaLyo24PdjpRJKIvOqYC1wQu
+o3D43pgtmjVVu8i1f/+X4akIURetA7pkeWGZVKMCgYAuDjUFv5qS2wia9aADapTB
+dIjvQYM3fCdGHnseTDtT+AxI49PVuav7AO0ZgeDdEpT/2f5bj6BDc/KZFT8T9/CQ
+WYARhOxxoeZUGViSxCInlDgahzGpHS7y3Mve6MkwWXz5AQrJ9kMnAq20yTtcE8Hy
+QqOoY054yyLEBHpewt0wuQKBgQCzusO//6y8Cb1n3u4ESUWHRZ5J60Bq9HZowzwm
+Q+1uSMonK+LY3uupmljFyec6w8H0gouanTkQFrqok/7+TsYmHi7ExZIvFpfSXEaf
+JSHaFRN/m4WglNCHda9IL8y6XWtl+SuubVAzTzXD2fi1Ls05T+tnkxtQhTJRb2vB
+IzkbgwKBgCuymXXQ41EzdJQoTWDe8CFLrP5ynKeaKzMN32ppUMbgb+DF4L9UpDm1
+CgckZ3THQEuh7yReY/2bU+XHK/GCdheNes+CXxu4dgSaVL/LONO08RuneDK1kQ5o
+e1oy4f+51rbwNGoUQ73U+cm/LSFJOir5EuNenpVZeMeQMktkg806
+-----END RSA PRIVATE KEY-----

+ 3 - 0
Packages/CgRPC/Sources/cgrpc.h

@@ -141,6 +141,9 @@ cgrpc_completion_queue *cgrpc_client_completion_queue(cgrpc_client *client);
 
 // server support
 cgrpc_server *cgrpc_server_create(const char *address);
+cgrpc_server *cgrpc_server_create_secure(const char *address,
+                                         const char *private_key,
+                                         const char *cert_chain);
 void cgrpc_server_stop(cgrpc_server *server);
 void cgrpc_server_destroy(cgrpc_server *s);
 void cgrpc_server_start(cgrpc_server *s);

+ 24 - 0
Packages/CgRPC/Sources/server.c

@@ -48,6 +48,30 @@ cgrpc_server *cgrpc_server_create(const char *address) {
   return server;
 }
 
+cgrpc_server *cgrpc_server_create_secure(const char *address,
+                                         const char *private_key,
+                                         const char *cert_chain) {
+  cgrpc_server *server = (cgrpc_server *) malloc(sizeof (cgrpc_server));
+  server->server = grpc_server_create(NULL, NULL);
+  server->completion_queue = grpc_completion_queue_create(NULL);
+  grpc_server_register_completion_queue(server->server, server->completion_queue, NULL);
+
+  grpc_ssl_pem_key_cert_pair server_credentials;
+  server_credentials.private_key = private_key;
+  server_credentials.cert_chain = cert_chain;
+
+  grpc_server_credentials *credentials = grpc_ssl_server_credentials_create
+  (NULL,
+   &server_credentials,
+   1,
+   0,
+   NULL);
+  
+  // prepare the server to listen
+  server->port = grpc_server_add_secure_http2_port(server->server, address, credentials);
+  return server;
+}
+
 void cgrpc_server_stop(cgrpc_server *server) {
   grpc_server_shutdown_and_notify(server->server,
                                   server->completion_queue,

+ 7 - 0
Packages/gRPC/Sources/Server.swift

@@ -60,6 +60,13 @@ public class Server {
     handlers = NSMutableSet()
   }
 
+  public init(address:String, key:String, certs:String) {
+    s = cgrpc_server_create_secure(address, key, certs)
+    completionQueue = CompletionQueue(cq:cgrpc_server_get_completion_queue(s))
+    completionQueue.name = "Server " + address
+    handlers = NSMutableSet()
+  }
+
   deinit {
     cgrpc_server_destroy(s)
   }