Google Nexus 4 jeszcze taniej

Przedwczoraj Google obniżył‚o ceny Nexus 4 o 100$. Na chwilę obecną… wersja 8GB kosztuje w USA 199$, wersja 16GB jest za 249$. Sprawdziłem szybko, jak mają… się™ ceny na ebay-u i jak widać nadal można go jeszcze kupić po starej cenie. Jest jedna oferta za 249$, ale większość‡ ofert oscyluje w okolicach 330$ – 390$. Ceny Nexus 4 na ebay-u zawsze były dla mnie zagadką…, ale chyba jacyś kupujący muszą być. Sprawdziłem listę™ aukcji, które zakończyły się sprzedażą… – i widać‡, że były aukcje zakończone nawet powyżej 400$ za sam telefon w wersji 16GB…

Tak czy siak – przy obecnej cenie Nexus 4 grzech byłoby nie kupić… albo poczekać na iPhone 5s, a może obniżka cen to zapowiedź Nexus 5?

Microsoft Office dla Androida

W tym tygodniu Microsoft wypuścił Microsoft Office dla Androida (4.0+). Na razie wygląda i działa bardzo dobrze. Bardzo podoba mi się intuicyjna integracja ze SkyDrive. Tylko dla abonentów Office 365 – mał‚y minus, ale prawdopodobnie już wkrótce standard dla użytkowników domowych, biorą…c pod uwagę cenę 100$/rok za 5 urządzeń w domu.

Więcej informacji na the Verge.

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.

Windows Phone 8: to nie są certyfikaty, których szukacie

W skrĂłcie: SSL w Windows Phone 8 jest popsute

Testowaliśmy telefony z WP8 uĹźywając serwera, ktĂłry wymaga uwierzytelniania uĹźytkownika za pomocą certyfikatĂłw. Po wrzuceniu na urządzenie certyfikatu z naszego CA – telefon łączył się z serwerem. Czasem pokazywał się z certyfikatem naszego CA, a czasem z zupełnie innym.

PoniĹźej zrzuty ekranu z sesji SSL. Interesująco zaczyna się po tym, jak serwer zarząda certyfikatu wysyłając „Certificate Request” (kliknij w obrazek, Ĺźeby zobaczyć go w pełnej rozdzielczości):

Certificate Request

Nasz serwer zażądał certyfikatu klienta pasującego do DN naszego własnego CA.

A oto odpowiedĹş klienta:

Co tu widzimy? Telefon odpowiedział certyfikatem wydanym przez Microsoft, zamiast podać nasz certyfikat, lub po prostu anulować transakcję.

Hierarchia tego certyfikatu:

  • Certificate (id-at-commonName=urn:wp-ac-hash-2:PAzCfbUuekP_SrTA0NUecBjyqN1f5,id-at-organizationalUnitName=9DFF3EFECE1B1D3E352EF654DEFBB9DED7)
    • Certificate (id-at-commonName=Microsoft Genuine Windows Phone CA4,id-at-organizationalUnitName=GFS,id-at-organizationName=Microsoft Corporation,id-at-localityName=Redmond,id-at-stateOrProvinceName=WA,id-at-countryName=US)
      • Certificate (id-at-commonName=Microsoft Windows Phone PCA,id-at-organizationName=Microsoft Corporation,id-at-localityName=Redmond,id-at-stateOrProvinceName=Washington,id-at-countryName=US)

Wujek Google niestety nie pomĂłgł w odpowiedzi na pytanie czym jest „wp-ac-hash-2”, ale wygląda to na certyfikat urządzenia wystawiony przez Global Foundation Services (GLS) Microsoftu. Wg. http://www.globalfoundationservices.com/ jest to jednostka zarządzająca chmurą w MS, więc nie zdziwiłbym się, gdyby był to certyfikat odpowiedzialny za uwierzytelnianie telefonu z usługami Microsoftu takimi jak Zune, sklep etc.

Nie wygląda to ciekawie. Wnioski nasuwają mi się takie:

  • Uwierzytelnianie za pomocą certyfikatĂłw moĹźe działać lub nie – w zaleĹźności od tego czy telefon będzie miał dobry humor i odpowie poprawnym certyfikatem lub nie
  • Telefon moĹźe mieć problemy z kontaktem z usługami Microsoftu, jeĹźeli takowe wymagają certyfikatu. WyobraĹźam sobie, Ĺźe moĹźe przestać działać na telefonie sklep, lub telefon nie będzie w stanie uwierzytelnić oprogramowania
  • Certyfikaty mogą być wystawione na atak poprzez proxy wywołań telefonu do usług korzystających z uwierzytelniania za pomocą certyfikatĂłw. Atakujący nakłania uĹźytkownika do wejścia na swĂłj serwer w internecie, ktĂłry żąda certyfikatu i liczy na to, Ĺźe telefon uĹźytkownika przedstawi certyfikat wykorzystywany np. do korporacyjnej poczty. Następnie atakujący przekierowuje negocjację SSL do docelowego serwera, gdzie będzie wyglądało jakby to uĹźytkownik kontaktował się ze swoją skrzynką pocztową.

A tak przy okazji – wygląda na to, Ĺźe obsługa certyfikatĂłw w Windows Phone 8 została potraktowana po macoszemu. Wystarzczy obejrzeć ten dokument: Windows Phone 8 Certificate Installation. Jedyną opcją na dostarczenie certyfikatu jest poczta lub IE? Nie ma moĹźliwości instalowania certyfikatĂłw przez protokół MDM?

 

GDR2: Radio FM w Windows Phone 8?

The Verge powołuje się na źródła w Microsofcie pisząc, że kolejna aktualizacja WP8 będzie wspierała radio FM. Chodzi o GDR2 (General Distribution Release 2), dla przypomnienia Portico to GDR1. Wygląda na to, że radio obsługiwały będą Lumia 920 i 820 oraz inne kompatybilne telefony. Okazuje się, że klucze w rejestrze nie były tam bez powodu.

Przy okazji the verge opisuje inne aktualizacje, które do GDR2 ma dodać Nokia: odblokowanie ekranu przez dwukrotne stuknięcie, szybkie wyciszanie, profil kolorów ekranu.

Aktualizacja ma być dostępna wkrĂłtce – zakładam, Ĺźe zanim Google ostatecznie wyłączy ActiveSync dla uĹźytkownikĂłw Windows Phone pod koniec lipca.

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.

 

 

 

Zarządzanie Windows Phone 8 cz.1

Krótki wstęp o tym, jak Microsoft rozszerzył możliwości zarządzania telefonami w Windows Phone 8.

Dla przypomnienia – telefony Windows Phone 7.x wspierały jedynie protokół ActiveSync – a więc wymuszenie polityki haseł czy kasowanie danych na telefonie odbywało się z poziomu Microsoft Exchange lub innych rozwiązań korzystających z tego protokołu. Rozwiązanie moĹźe wystarczające dla niektĂłrych, jednak nie dla firm wymagających bardziej rozbudowanego zarządzania czyli np. inwentaryzacji aplikacji itp.

Z myślą o bardziej wymagających klientach w Windows Phone 8, oprĂłcz zarządzania przy pomocy ActiveSync, pojawiło się coś, co Microsoft nazywa „Enterprise Device Management” a w sumie jest MDM – Mobile Device Management. SpĂłjrzmy więc czym to się je.

Na początek ĹşrĂłdło informacji. Microsoft zamieszcza dokumentację do swojego MDM tutaj: http://www.windowsphone.com/en-us/business/phone-management . OprĂłcz odnośnikĂłw do sekcji o ActiveSync, SCCM czy Intune znajdziemy link do  dokumentu „Enterprise Device Management Protocols”. Dokument ten w szczegółach opisuje MDM dla Windows Phone 8. UWAGA, dokument ten jest w miarę często modyfikowany – obecna wersja oznaczona jest „February 2013—DRAFT” i jest chyba trzecią czy czwartą wersją, jaką znam.

A więc co mamy:

  • wbudowanego klienta do rejestracji i zarządzania telefonem
  • wsparcie dla otwartego protokołu OMA DM (Open Mobile Alliance Device Management) znanego z… Windows Mobile
  • zarządzanie telefonem przy pomocy obiektĂłw CSP – Configuration Service Provider
  • zarządzanie aplikacjami firmowymi
  • wymuszenie polityki haseł
  • szyfrowanie pamięci telefonu – ale nie karty SD, oraz szyfrowania nie moĹźna wyłączyć
  • moĹźliwość wyłączenia karty SD
  • zerowanie telefonu – dotyczy tylko pamięci wbudowanej telefonu, nie formatuje karty SD
  • konfiguracja certyfikatĂłw na telefonie – dodawanie zaufanych certyfikatĂłw
  • konfiguracja klienta poczty – konta Exchange i POP3/IMAP4
  • pobieranie informacji o telefonie typu model, wersja systemu etc.
  • przesyłanie tokenĂłw dewelopera (AET – Application Enrollment Token) – umoĹźliwiających instalowanie aplikacji spoza Microsoft Store
  • jednoczesne wsparcie dla ActiveSync i MDM

Czego nie mamy (z tych najwaĹźniejszych):

  • brak wsparcia dla przesyłania wiadomości metodą push do telefonu (coś jak  APNS czy C2DM/GCM), taka moĹźliwość jest dla zwykłych aplikacji działających na WP8, więc trochę dziwne, Ĺźe Microsoft nie wprowadził jej dla klienta OMA DM
  • komunikacja z serwerem tylko na żądanie klienta OMA DM, lub wymuszona przez uĹźytkownika – serwer nie moĹźe zażądać zameldowania się od telefonu
  • brak zamkniętej pętli – czyli powiadamiania serwera np. o zerwaniu relacji MDM
  • nie ma moĹźliwości pobrania kluczowej infromacji o telefonie – jego numeru, bardzo ogranicza to moĹźliwość komunikacji z uĹźytkownikiem czy nawet identyfikację urządzenia
  • konfiguracja certyfikatĂłw ograniczona do zaufanych certyfikatĂłw – czyli nie moĹźna przesłać do telefonu certyfikatu uĹźytkownika np. w przypadku uwierzytelniania Exchange z certyfikatem, Microsoft proponuje w tym wypadku przesyłanie certyfikatu e-mailem lub wystawienie go na stronę www
  • brak moĹźliwości konfiguracji WiFi czy VPN – o ile VPNu w WP8 po prostu nie ma, to nie wspieranie CSP dla WiFi jest chyba niedopatrzeniem, ktĂłre miejmy nadzieję Microsoft kiedyś naprawi
  • nie ma moĹźliwości zablokowania interfejsu uĹźytkownika dla ustawień wymuszonych przez MDM – np. Ĺźeby uniemoĹźliwić uĹźytkownikowi zmianę ustawień klienta poczty
  • klient rejestracji nie jest konfigurowalny – nie moĹźna np. przesłać uĹźytkownikowi SMSa z linkiem, ktĂłry zarejestrowałby urządzenie, uĹźytkownik zmuszony jest do ręcznej rejestracji (podanie adresu email/hasła i ew. nazwy serwera)

Jeszcze dodam, Ĺźe duĹźym minusem jest fakt, Ĺźe mimo tej samej platformy (ARM) i nawet tej samej aplikacji („Company Apps”) oraz w sumie tych samych protokołów – WindowsRT róşni się znacząco. Np. do zarządzania WindowsRT trzeba modyfikować niektĂłre parametry rejestracji, o czym innym razem.