SRSecurityPolicy.m 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. //
  2. // Copyright (c) 2016-present, Facebook, Inc.
  3. // All rights reserved.
  4. //
  5. // This source code is licensed under the BSD-style license found in the
  6. // LICENSE file in the root directory of this source tree. An additional grant
  7. // of patent rights can be found in the PATENTS file in the same directory.
  8. //
  9. #import "SRSecurityPolicy.h"
  10. #import "SRPinningSecurityPolicy.h"
  11. NS_ASSUME_NONNULL_BEGIN
  12. @interface SRSecurityPolicy ()
  13. @property (nonatomic, assign, readonly) BOOL certificateChainValidationEnabled;
  14. @end
  15. @implementation SRSecurityPolicy
  16. + (instancetype)defaultPolicy
  17. {
  18. return [self new];
  19. }
  20. + (instancetype)pinnningPolicyWithCertificates:(NSArray *)pinnedCertificates
  21. {
  22. [NSException raise:NSInvalidArgumentException
  23. format:@"Using pinned certificates is neither secure nor supported in SocketRocket, "
  24. "and leads to security issues. Please use a proper, trust chain validated certificate."];
  25. return nil;
  26. }
  27. - (instancetype)initWithCertificateChainValidationEnabled:(BOOL)enabled
  28. {
  29. self = [super init];
  30. if (!self) { return self; }
  31. _certificateChainValidationEnabled = enabled;
  32. return self;
  33. }
  34. - (instancetype)init
  35. {
  36. #pragma clang diagnostic push
  37. #pragma clang diagnostic ignored "-Wdeprecated"
  38. return [self initWithCertificateChainValidationEnabled:YES];
  39. #pragma clang diagnostic pop
  40. }
  41. - (void)updateSecurityOptionsInStream:(NSStream *)stream
  42. {
  43. // Enforce TLS 1.2
  44. [stream setProperty:(__bridge id)CFSTR("kCFStreamSocketSecurityLevelTLSv1_2") forKey:(__bridge id)kCFStreamPropertySocketSecurityLevel];
  45. // Validate certificate chain for this stream if enabled.
  46. NSDictionary<NSString *, id> *sslOptions = @{ (__bridge NSString *)kCFStreamSSLValidatesCertificateChain : @(self.certificateChainValidationEnabled) };
  47. [stream setProperty:sslOptions forKey:(__bridge NSString *)kCFStreamPropertySSLSettings];
  48. }
  49. - (BOOL)evaluateServerTrust:(SecTrustRef)serverTrust forDomain:(NSString *)domain
  50. {
  51. // No further evaluation happens in the default policy.
  52. return YES;
  53. }
  54. @end
  55. NS_ASSUME_NONNULL_END