Bliźniacze certyfikaty z iOS

Kolejny o certyfikatach. Powiedzmy, że piszesz aplikację™ na iOS, która ma uwierzytelniać‡ się za pomocą certyfikatu. Implementujesz coś› takiego:


- (void)connection:(NSURLConnection *)connection willSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge {
 if ([challenge previousFailureCount] > 0) {

NSLog(@"Incorrect auth challenge %@", challenge);
 [[challenge sender] cancelAuthenticationChallenge:challenge];
 return;
 }

// Checking the server certificate
 if ([[challenge protectionSpace] authenticationMethod] == NSURLAuthenticationMethodClientCertificate &&
 self.account.clientCertificate.privateRepresentation.length > 0) {

/*
 Reading the certificate and creating the identity
 */

NSData *p12Data = self.account.clientCertificate.privateRepresentation;

CFStringRef password = (__bridge CFStringRef)(self.account.clientCertificate.privatePassword);
 const void *keys[] = { kSecImportExportPassphrase };
 const void *values[] = { password };
 CFDictionaryRef optionsDictionary = CFDictionaryCreate(NULL, keys, values, 1, NULL, NULL);
 CFArrayRef p12Items;

OSStatus result = SecPKCS12Import((__bridge CFDataRef)p12Data, optionsDictionary, &p12Items);

if(result == noErr) {
 CFDictionaryRef identityDict = CFArrayGetValueAtIndex(p12Items, 0);
 SecIdentityRef identityApp =(SecIdentityRef)CFDictionaryGetValue(identityDict,kSecImportItemIdentity);

SecCertificateRef certRef;
 SecIdentityCopyCertificate(identityApp, &certRef);

SecCertificateRef certArray[1] = { certRef };
 CFArrayRef myCerts = CFArrayCreate(NULL, (void *)certArray, 1, NULL);
 CFRelease(certRef);

NSURLCredential *credential = [NSURLCredential credentialWithIdentity:identityApp certificates:(__bridge NSArray *)myCerts persistence:NSURLCredentialPersistencePermanent];
 CFRelease(myCerts);

[[challenge sender] useCredential:credential forAuthenticationChallenge:challenge];
 }
 else {
 // Certificate is invalid or password is invalid given the certificate
 NSLog(@"Invalid certificate or password");
 return;
 }
 } else {
 // For normal authentication based on username and password. This could be NTLM or Default.
 if ([[challenge protectionSpace] authenticationMethod] == NSURLAuthenticationMethodClientCertificate) {
 NSLog(@"Certificate might be required");
 }
 NSURLCredential *credential = [NSURLCredential credentialWithUser:self.account.username
 password:self.account.password
 persistence:NSURLCredentialPersistenceNone];
 [[challenge sender] useCredential:credential forAuthenticationChallenge:challenge];
 }

}

Wszystko wygląda dobrze na pierwszy rzut oka. W większoś›ci przypadków nawet będzie‚ działało. Jeżeli jednak trafisz na problem ze swoim serwerem i sprawdzisz jak to wygląda w Wiresharku:

iOS certs

Widzimy, że coś› nie jest do końca w porządku. Klient wysłał‚ ten sam certyfikat dwa razy. Ogólnie nie powinno być to problemem, ale jeżeli Twój serwer przetwarza certyfikaty i spodziewa się™, że™ będą… uporządkowane w łańcuch: certyfikat klienta, wydawca certyfikatu klienta itd. – wtedy mogą… być problemy.

Problem tego typu można… rozwiązać po stronie klienta lub po stronie serwera. Jednak najpoprawniejsze wydaje mi się™ naprawienie go po stronie klienta. Zgodnie z RFC2246 i RFC5246 certyfikat klienta powinien wystąpić‡ tylko raz:

certificate_list
This is a sequence (chain) of X.509v3 certificates. The sender’s
certificate must come first in the list. Each following
certificate must directly certify the one preceding it. Because
certificate validation requires that root keys be distributed
independently, the self-signed certificate which specifies the
root certificate authority may optionally be omitted from the
chain, under the assumption that the remote end must already
possess it in order to validate it in any case.
The same message type and structure will be used for the client’s
response to a certificate request message. Note that a client may
send no certificates if it does not have an appropriate certificate
to send in response to the server’s authentication request.

Na szczęście poprawienie tego problemu jest trywialne. Zamieniamy tę linijkę:

NSURLCredential *credential = [NSURLCredential credentialWithIdentity:identityApp certificates:(__bridge NSArray *)myCerts persistence:NSURLCredentialPersistencePermanent];

na:

NSURLCredential *credential = [NSURLCredential credentialWithIdentity:identityApp certificates:nil persistence:NSURLCredentialPersistencePermanent];

Testujemy, wszystko wygląda poprawnie. Problem rozwią…zany bez kosztownych zmian w kodzie serwera.

Podglądanie rejestru Windows Phone 8

W przypadku Windows Phone 8 niestety nie mamy oficjalnie prawie żadnego dostępu do logów czy rejestru systemu. Ogranicza to bardzo mocno możliwość‡ sprawdzenia, co tak naprawdę w telefonie się dzieje. Na forum Windows Phone 8 Development and Hacking możemy poczytać jak podmontować pliki ffu lub np. jak wygląda układ partycji w telefonie.

A poniżej moja recepta na odczytanie rejestru z emulatora WP8 – bardzo przydatne np. przy rozkładaniu MDM w WP8 na cz궛ci.

  1. Startujemy emulator WP8 i wykonujemy operacje, których wynik potem chcemy podejrzeć (np. rejestrujemy telefon z Intune)
  2. Podczas kiedy emulator jest włą…czony, kopiujemy plik %userprofile%\AppData\Local\Microsoft\XDE\*.avhd do jakiegoś innego katalogu, np. na pulpit (powinien być tylko 1 plik avhd). Dlaczego przy włączonym emulatorze? Ponieważ przy wyłączaniu emulatora plik .avhd nie jest łączony z obrazem dysku emulatora, emulator przywracany jest do stanu początkowego. Można to obejść‡ uruchamiając XDE.exe ręcznie – ale ta metoda ostatnio nie chciała działać na moim komputerze więc nie uznaję™ jej za stabilną.
  3. Zmieniamy nazwę pliku .avhd na .vhd
  4. Klikamy prawym przyciskiem myszki na .vhd i montujemy dysk
  5. W systemie pojawia nam się kilka dysków (odpowiednie partycje WP8) – szukamy tego z plikiem \Windows\System32\config\SOFTWARE (w moim wypadku był to dysk G)
  6. Kopiujemy cały folder \Windows\System32\config do jakiegoś nowego katalogu, np. na pulpicie
  7. Cyścimy atrybuty (tylko do odczytu, archiwalny, system etc.) z plików w tym katalogu
  8. Montujemy hive SOFTWARE używając regedit-a (http://www.petri.co.il/edit_registry_settings_for_users_other_than_myself.htm)
  9. Rozpoczynamy zabawę™

Co ciekawego można tam znaleźć‡?

  • Wygląda na to, że są obecne klucze związane z radiem FM – czyli Microsoft przygotowywał‚ się do wsparcia radia w telefonach?
  • Ze spraw związanych z MDM:
    • \Microsoft\Enrollment – informacje dotyczące rejestracji telefonu
    • \Microsoft\Enrollment\OmaDmRetry – ustawienia protokołu OMA DM, jeżeli chodzi o połą…czenia z serwerem
    • \Microsoft\EnterpriseAppManagement\Database\Tbl_EnrollmentToken -€“ informacje dotyczące Application Enrollment Token (AET)
    • \Microsoft\EnterpriseAppManagement\Database\Tbl_XAPRequest -“ informacje dotyczące aplikacji firmowej – z uwzglę™dnieniem np. tego czy pobranie jej się powiodło lub jaki wystąpił błąd
    • \Microsoft\Provisioning -€“ żyła złota, m.in. lista wspieranych CSP? Wygląda na to, że jest ich dużo więcej niż opisywane w oficjalnej dokumentacji, np. „BrowserFavorite” czy „HotSpot”… oba znane z Oma dla Windows Mobile… naprawdę ciekawa sprawa

Zarządzanie Windows Phone 8 cz.2

O związanych z MDM aplikacjach na Windows Phone 8.

Mamy do czynienia z czterema aplikacjami:

  1. Klient rejestracji – jedyny z wbudowanych w telefon, ktĂłry ma interfejs graficzny – to ten, ktĂłry widzicie przechodząc przez kreator „Company Apps”. W nagłówkach HTTP ten program identyfikuje się jako „Windows Phone 8 Enrollment Client”
  2. Program odpowiedzialny za pobieranie aplikacji pod koniec rejestracji – podczas rejestracji Windows Phone 8 moĹźna do telefonu przesłać adres URL z ktĂłrego telefon pobierze i zainstaluje jedną aplikację. W nagłówkach HTTP identyfikuje się jako „ZDM/4.0; Windows Mobile 8.0”
  3. Klient MDM – odpowiedzialny za komunikację z serwerem przy wykorzystaniu protokołu OMA. „MSFT OMA DM Client/1.2.0.1”
  4. Opcjonalnie – coś co Microsoft nazywa „company app or Hub” – czyli aplikacja firmowa. MoĹźe zostać zainstalowana opcjonalnie pod koniec rejestracji telefonu. Wykorzystanie tej aplikacji zaleĹźy od konkretnej firmy, Microsoft wyobraĹźa sobie, Ĺźe będzie to coś w stylu centrum komunikacji dla pracownikĂłw – z tej aplikacji będą mogli np. instalować inne aplikacje firmowe, pobierać komunikaty itp.

 

 

 

Pociąg z Androidem odjechał

Patrząc na dane z IDC nie ma wątpliwości, Ĺźe Android jest juĹź od ponad roku wiodącą platformą dla smartfonĂłw. Dla mnie jednak najwyraĹşniejszym znakiem nowej jakości było to, ktĂłry telefon polecany jest jako najlepszy. Samsung Galaxy SIII – na Facebooku wśrĂłd znajomych pytających o wybĂłr telefonu. A potem w innym towarzystwie – znowu Galaxy SIII dla dziewczyny zmieniającej aparat. Osobiście przekonałem się, Ĺźe iPhone 5 nie robi takiego wraĹźenia jak nowe zabawki ze stajni Samsunga. Jeszcze jakiś czas temu myślałem, Ĺźe Android moĹźe pozostanie platformą z jednej strony dla pasjonatĂłw grzebania w telefonie, z drugiej strony jako najtańsza alternatywa na rynku. Podstawowym powodem takiego myślenia była u mnie obserwacja aplikacji i samego systemu – w przypadku Androida kaĹźda prawie aplikacja rządziła się swoimi prawami, te same ustawienia wyglądały inaczej, te same opcje moĹźna było zmieniać w kilku miejscach. Co innego iOS – w tym wypadku Apple wyraĹşnie wskazywał deweloperom jak ich aplikacje mają wyglądać i zachowywać się – i podobnie było z samym systemem – wszystkie ustawienia jasno i wyraĹşnie na swoich miejscach.

Okazuje się, Ĺźe myliłem się – otwarte środowisko Androida z jednej strony doprowadziło do fragmentacji, z drugiej strony powoduje, Ĺźe producenci sprzętu i programiści często i szybko wypuszczają ulepszone wersje swoich produktĂłw.

Widzę Androida 4.2 (Jelly Bean), HTC One, multum dobrych aplikacji… – i myślę sobie, Ĺźe to juĹź nie jest alternatywa dla dla Apple. Android jest jakością samą w sobie i to właśnie Apple (i innym producentom) bardzo ciężko będzie zawalczyć o konsumenta z Androidem.

Chart: Worldwide Smartphone Market, OS Share, 2012 Q4Description: IDC’s Worldwide Quarterly Mobile Phone Tracker provides smart phone and feature phone market data in 54 countries by vendor, device type, air interface, operating systems and platforms, and generation. Over 20 additional technical segmentations are provided. The data is provided four times a year and includes historical and forecast trend analysis. For more information, or to subscribe to the research, please contact Kathy Nagamine at 1-650-350-6423 or knagamine@idc.com.Further detail about this tracker can be found at:http://www.idc.com/tracker/showproductinfo.jsp?prod_id=37Tags: smartphone, iOS, Apple, Android, Samsung, Blackberry, Windows Phone, Microsoft, Symbian, iPhone, Galaxy, Nexus, Mobile, operating system, mobilityAuthor: IDCcharts powered by iCharts

 

Surface Pro – pierwszy rzut oka

Dzisiaj miałem okazję rzucić okiem na Microsoft Surface Pro. To ten PeCetoTablet z Intel Core i5 + Windows 8 na pokładzie. Tak na szybko:

  • Szerokość/wysokość – identyczne z SurfaceRT, co do grubości – tak na oko prawie 2x SurfaceRT, czyli w sumie tak gruby jak Samsung Slate 7.
  • Waga – dość ciężki, ale nie aĹź tak ciężki jak moĹźnaby się spodziewać po jego rozmiarach. W rękach trzyma się OK, chociaĹź podejrzewam, Ĺźe po dłuĹźszym czasie będzie to męczące.
  • Materiał, z ktĂłrego wykonana jest obudowa – chyba identyczny z SurfaceRT – ten sam czarny, matowy kolor.
  • Podstawka chyba dokładnie taka sama jak w SurfaceRT?
  • Ekran – wygląda bardzo ładnie, ostry, szybkość reakcji chyba taka sama jak w SurfaceRT. Czyli znośnie, oprĂłcz opóźnienia przy obracaniu ekranu.
  • Bateria – podobno wytrzymuje 5 godzin?

Blackberry 10

Wczoraj przez 5 minut bawiłem się BlackBerry Z10 z nowym systemem BB10.

  • To nie było urządzenie  ktĂłre ostatecznie trafi do klientĂłw – coś między prototypem a wersją ostateczną, pomimo tego wyglądało bardzo zgrabnie, świetny ekran, obudowa wprawdzie dziwna w dotyku, ale moĹźe wersja dla klientĂłw będzie inna?
  • Dobrze trzyma się w ręku, telefon sprawia wraĹźenie bardzo lekkiego. Wg. specyfikacji około 130g, czyli więcej niĹź iPhone5, ale w dłoni nie czuć było róşnicy. Na pewno duĹźo lĹźejszy niĹź Lumia 820, ktĂłrej uĹźywam ostatnio.
  • Ekran bardzo wyraĹşny, czcionki bardzo ostre, nawet przy małym tekście (np. pomniejszone strony www)
  • Wspomaganie wpisywania tekstu (to suwanie do gĂłry, Ĺźeby wybrać słowo) – bardzo intuicyjne. Nie wiem, jak zachowuje się w przypadku języka polskiego, ale dla angielskiego było w miarę dokładne. Mam wraĹźenie, Ĺźe BlackBerry nie odgaduje kontekstu tak dobrze jak np. Microsoft w Windows Phone 8, więc podpowiedzi kolejnego słowa nie zawsze miały sens.
  • Mapy – są,  podobno TomTom?
  • Obsługa całego systemu – meh… taka sobie… Telefon nie ma fizycznych guzikĂłw typu „home” itp. – wszystko robi się suwaniem, np. z spoza ekranu z dołu do gĂłry, Ĺźeby wrĂłcić do ekranu startowego. Mam nadzieję, Ĺźe w wersji, ktĂłra ostatecznie trafi do klientĂłw poprawią czułość i dokładność. Przykładowo, Ĺźeby pokazać nieprzeczytane wiadomości suwa się jakoś tak do połowy ekranu, Ĺźeby przejść do samych wiadomości trzeba potem sunąć palcem w prawo – i to jakoś średnio działało. Po włączeniu youtube nie dało się z niego wyjść (mimo tego, Ĺźe to po prostu przeglądarka) – prĂłbowaliśmy w kilka osĂłb i dopiero po ktĂłrymś tam pociągnięciu telefon zareagował. Nie mam pojęcia dlaczego akurat z youtube był problem – z wyjściem z innych aplikacji nie mieliśmy takich problemĂłw.
  • No i na koniec – telefon się tnie. Teoretycznie procesor to dwurdzeniowy Snapdragon – ale zauwaĹźyliśmy, Ĺźe przy przełączaniu aplikacji czy przy przewijaniu stron www z dużą ilością grafiki – ekran przycina się na ułamek sekundy. Ładowanie stron www teĹź dziwnie wolne. Nie wyglądało to dobrze. Na pewno telefon nie był tak płynny jak iPhone, WP8 czy mocniejsze Androidy. Jednocześnie youtube odtwarza się płynnie.