2009-12-23 20 views
8

Gần đây tôi cần cấu hình CocoaHttpServer, mà chúng tôi đang sử dụng trong ứng dụng của mình để thành công, để xử lý các kết nối HTTPS đến từ ứng dụng khách (chạy trên thiết bị Android). Điều này là tốt - có mã mẫu phong phú cho phép điều này, và chúng tôi đã có thể kích hoạt máy chủ bảo mật mà không có vấn đề.Làm thế nào để đặt mật mã SSL khi sử dụng CFSocket/CFStream trong Cocoa?

Trong thực tế, chúng tôi đã nhìn thấy các giai đoạn đàm phán SSL cực kỳ dài trong khi khách hàng đã bắt tay với máy chủ của chúng tôi - tối đa 70 giây.

Thông qua một chuỗi dài các tìm kiếm, tôi nhận thấy sự chậm trễ là do việc tính toán các tham số Diffie-Hellman được sử dụng theo mặc định khi SSL được bật trong CFSocket. Đây là số thread là nơi tôi bắt đầu tìm câu trả lời cho vấn đề của mình.

Để phù hợp với những gì máy chủ Windows của chúng tôi đang làm (sử dụng mật mã SSL kém an toàn hơn), tôi cần đặt mật mã một cách rõ ràng trên Mac, điều này không dễ dàng khi sử dụng AsyncSocket làm trình bao bọc cho truyền thông ổ cắm.

của Windows của chúng tôi máy chủ đã được sử dụng: TLS_RSA_WITH_RC4_128_MD5) (0x04) RC4 128 bit MD5 RSA

Macintosh của chúng tôi máy chủ được sử dụng: TLS_DHE_RSA_WITH_AES_256_CBC_SHA (0x039) AES 256 bit SHA-1 Ephemeral Diffie-Hellman key trao đổi sử dụng giấy chứng nhận RSA

Sự khác biệt về "bảo mật" là lớn, nhưng có thể không đáng để nỗ lực/tính toán/chậm trễ mà chúng tôi đã thấy. Nhà hát an ninh?

+0

+1 cho nỗ lực của bạn và để làm cụm từ "Nhà hát an ninh"? vào bài viết của bạn :-) –

+1

Điều này rất hữu ích, nhưng bạn nên tách ra câu trả lời và đăng câu trả lời cho câu hỏi này, vì vậy điều này không tồn tại mãi mãi trên trang Chưa được trả lời. (Nó hoàn toàn kosher để trả lời câu hỏi của riêng bạn.) – benzado

Trả lời

4

Xin lưu ý rằng có các thuật toán mã hóa khác nhau có thể được chọn - tôi đã chọn sử dụng cùng một mật khẩu như triển khai Windows của chúng tôi để nhất quán.

Với thông tin từ another question được đề cập ở trên, tôi đã tìm hiểu cách đặt mật mã cho CFSocket để sử dụng giống như Windows và mã có vẻ tốt hơn một chút - giống như nó thực sự hoạt động! CFSocket không trực tiếp vạch trần sự hỗ trợ SecureTransport, mà làm cho loại khó, nhưng việc xác định một khóa cụ thể làm cho nó hoạt động tốt.

Đối với hậu thế, đây là đoạn code tôi đã thêm vào -onSocketWillConnect: trong lớp HttpConnection của chúng tôi:

// define this value; it isn't exposed by CFSocketStream.h 
const extern CFStringRef kCFStreamPropertySocketSSLContext; 

...

CFReadStreamRef stream = [sock getCFReadStream]; 
CFDataRef data = (CFDataRef) CFReadStreamCopyProperty(stream, kCFStreamPropertySocketSSLContext); 

// Extract the SSLContextRef from the CFData 
SSLContextRef sslContext; 
CFDataGetBytes(data, CFRangeMake(0, sizeof(SSLContextRef)), (UInt8*)&sslContext); 
SSLCipherSuite *ciphers = (SSLCipherSuite *)malloc(1 * sizeof(SSLCipherSuite)); 
ciphers[0] = SSL_RSA_WITH_RC4_128_MD5; // Basic cipher - not Diffie-Hellman 
SSLSetEnabledCiphers(sslContext, ciphers, 1); 

Tôi hy vọng điều này sẽ giúp mọi người làm việc thông qua các vấn đề tương tự như tôi - Tôi rất sẵn lòng chia sẻ thêm một số mã và lời khuyên nếu cần.

0

Đối với những gì đáng giá, tôi đã đóng góp patch cho CocoaAsyncSocket khoảng một tuần trước khi bạn gặp sự cố này. Rất tiếc, tôi không nhận thấy câu hỏi của bạn lúc đó. :-)

Các vấn đề liên quan